2025 B卷 200分 題型
本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析;
并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式!
本文收錄于專欄:《2025華為OD真題目錄+全流程解析/備考攻略/經驗分享》
華為OD機試真題《猴子吃桃/愛吃蟠桃的孫悟空》:
目錄
- 題目名稱:猴子吃桃/愛吃蟠桃的孫悟空
- 題目描述
- Java
- 問題分析
- 解題思路
- 代碼實現
- 代碼詳細解析
- 示例測試
- 綜合分析
- python
- 問題分析
- 解題思路
- 代碼實現
- 代碼詳細解析
- 示例測試
- 綜合分析
- JavaScript
- 問題分析
- 解題思路
- 代碼實現
- 代碼詳細解析
- 示例測試
- 綜合分析
- C++
- 問題分析
- 解題思路
- 代碼實現
- 代碼詳細解析
- 示例測試
- 綜合分析
- C語言
- 問題分析
- 解題思路
- 代碼實現
- 代碼詳細解析
- 示例測試
- 綜合分析
- GO
- 問題分析
- 解題思路
- 代碼實現
- 代碼詳細解析
- 示例測試
- 綜合分析
題目名稱:猴子吃桃/愛吃蟠桃的孫悟空
知識點:二分查找、邏輯處理
時間限制:1秒
空間限制:256MB
語言限制:不限
題目描述
孫悟空喜歡吃蟠桃,一天他趁守衛不在偷吃蟠桃。已知蟠桃園有 N 棵桃樹,每棵樹上的蟠桃數量用數組表示,守衛將在 H 小時后回來。
孫悟空可以決定吃桃速度 K(個/小時),每小時選一棵樹吃掉 K 個。若樹上桃子少于 K,則全部吃掉,且這一小時內不再吃其他樹。
求孫悟空在 H 小時內吃完所有蟠桃的 最小速度 K(整數),若無法完成則返回 0。
輸入描述
- 第一行:N 個正整數,表示每棵桃樹上的蟠桃數量,空格分隔。
- 第二行:一個正整數 H,表示守衛離開的時間。
- 數據范圍:
0 < N < 10000
,0 < H < 10000
,每棵樹上的蟠桃數量為正整數。
輸出描述
- 輸出最小速度 K,無解或輸入異常時輸出 0。
示例
輸入:
2 3 4 5
4
輸出:
5
說明:以速度 5 可在 4 小時內吃完所有桃子。
Java
問題分析
我們需要找到孫悟空在H小時內吃完所有蟠桃的最小速度K。每小時他可以選擇一棵樹吃掉K個,若樹上的桃子少于K則全部吃掉,且這一小時內不再吃其他樹。如果無法在H小時內吃完,返回0。
解題思路
- 輸入驗證:確保輸入的桃樹數量合法且H為正整數。
- 邊界確定:最小速度K為1,最大K為桃樹中桃子最多的數量。
- 二分查找:在可能的K范圍內,通過二分查找找到滿足條件的最小K。
- 時間計算:對于每個K,計算吃完所有桃子所需的總時間,并與H比較。
代碼實現
import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 讀取桃樹數組String[] firstLine = scanner.nextLine().split(" ");List<Integer> list = new ArrayList<>();try {for (String s : firstLine) {int num = Integer.parseInt(s);if (num <= 0) { // 桃子必須為正整數System.out.println(0);return;}list.add(num);}} catch (NumberFormatException e) { // 輸入異常處理System.out.println(0);return;}if (list.isEmpty()) { // 無桃樹情況System.out.println(0);return;}int[] piles = list.stream().mapToInt(i -> i).toArray();// 讀取Hif (!scanner.hasNextInt()) { // 檢查H是否為整數System.out.println(0);return;}int H = scanner.nextInt();if (H <= 0) { // H必須為正整數System.out.println(0);return;}// 檢查H是否足夠(至少需要N小時)if (H < piles.length) {System.out.println(0);return;}// 二分查找最小速度Kint left = 1;int right = Arrays.stream(piles).max().getAsInt();int ans = 0;while (left <= right) {int mid = left + (right - left) / 2;int time = calculateTime(piles, mid);if (time <= H) { // 時間足夠,嘗試找更小的Kans = mid;right = mid - 1;} else { // 時間不足,需要增大Kleft = mid + 1;}}System.out.println(ans);}// 計算以速度K吃完所有桃子的總時間private static int calculateTime(int[] piles, int K) {int total = 0;for (int pile : piles) {total += (pile + K - 1) / K; // 向上取整的技巧}return total;}
}
代碼詳細解析
-
輸入處理:
- 使用
Scanner
讀取輸入,分割成字符串數組。 - 將字符串轉換為整數,處理非法輸入(如非數字、非正數)。
- 使用
-
輸入驗證:
- 檢查桃樹數組是否為空。
- 檢查H是否為正整數,且H不小于桃樹數量。