asp手机网站自动跳转,如何做网站推广方式,常熟做网站公司,网站 没有备案 访问不了2025 B卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《猴子… 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(" ");ListInteger 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不小于桃树数量。