华为OD机试真题——猴子吃桃/爱吃蟠桃的孙悟空(2025B卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

在这里插入图片描述

2025 B卷 200分 题型

本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!

本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享

华为OD机试真题《猴子吃桃/爱吃蟠桃的孙悟空》:



题目名称:猴子吃桃/爱吃蟠桃的孙悟空


知识点:二分查找、逻辑处理
时间限制:1秒
空间限制:256MB
语言限制:不限


题目描述

孙悟空喜欢吃蟠桃,一天他趁守卫不在偷吃蟠桃。已知蟠桃园有 N 棵桃树,每棵树上的蟠桃数量用数组表示,守卫将在 H 小时后回来。
孙悟空可以决定吃桃速度 K(个/小时),每小时选一棵树吃掉 K 个。若树上桃子少于 K,则全部吃掉,且这一小时内不再吃其他树。
求孙悟空在 H 小时内吃完所有蟠桃的 最小速度 K(整数),若无法完成则返回 0。

输入描述

  • 第一行:N 个正整数,表示每棵桃树上的蟠桃数量,空格分隔。
  • 第二行:一个正整数 H,表示守卫离开的时间。
  • 数据范围:0 < N < 100000 < H < 10000,每棵树上的蟠桃数量为正整数。

输出描述

  • 输出最小速度 K,无解或输入异常时输出 0。

示例
输入:

2 3 4 5  
4  

输出:

5  

说明:以速度 5 可在 4 小时内吃完所有桃子。


Java

问题分析

我们需要找到孙悟空在H小时内吃完所有蟠桃的最小速度K。每小时他可以选择一棵树吃掉K个,若树上的桃子少于K则全部吃掉,且这一小时内不再吃其他树。如果无法在H小时内吃完,返回0。


解题思路

  1. 输入验证:确保输入的桃树数量合法且H为正整数。
  2. 边界确定:最小速度K为1,最大K为桃树中桃子最多的数量。
  3. 二分查找:在可能的K范围内,通过二分查找找到满足条件的最小K。
  4. 时间计算:对于每个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();
        
        // 读取H
        if (!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;
        }
        
        // 二分查找最小速度K
        int 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) {
    // 时间足够,尝试找更小的K
                ans = mid;
                right = mid - 1;
            } else {
    // 时间不足,需要增大K
                left = 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;
    }
}

代码详细解析

  1. 输入处理

    • 使用Scanner读取输入,分割成字符串数组。
    • 将字符串转换为整数,处理非法输入(如非数字、非正数)。
  2. 输入验证

    • 检查桃树数组是否为空。
    • 检查H是否为正整数,且H不小于桃树数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纪元A梦

再小的支持也是一种动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值