华为OD机试真题 - 爱吃蟠桃的孙悟空 (D卷,100分)

2024华为OD机试真题,代码包含语言java、js、python、c 代码基本都有详细注释。

题目描述

孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有 N 棵桃树,每颗树上都有桃子,守卫将在 H 小时后回来。

孙悟空可以决定他吃蟠桃的速度K(个/小时),每个小时选一颗桃树,并从树上吃掉 K 个,如果树上的桃子少于 K 个,则全部吃掉,并且这一小时剩余的时间里不再吃桃。

孙悟空喜欢慢慢吃,但又想在守卫回来前吃完桃子。

请返回孙悟空可以在 H 小时内吃掉所有桃子的最小速度 K(K为整数)。如果以任何速度都吃不完所有桃子,则返回0。

输入描述

第一行输入为 N 个数字,N 表示桃树的数量,这 N 个数字表示每颗桃树上蟠桃的数量。

第二行输入为一个数字,表示守卫离开的时间 H。

其中数字通过空格分割,N、H为正整数,每颗树上都有蟠桃,且 0 < N < 10000,0 < H < 10000。

输出描述

吃掉所有蟠桃的最小速度 K,无解或输入异常时输出 0。

用例
### 孙悟空蟠桃问题的Python实现 针对孙悟空蟠桃的问题,可以通过二查找算法找到最小速度 \( K \),使得孙悟空能够在给定时间内吃完所有桃子。以下是具体的Python代码实现: ```python def min_eating_speed(piles, h): """ 计算孙悟空能在h小时内吃完所有桃子的最小速度K。 参数: piles (list): 每棵树上的蟠桃数量列表。 h (int): 守卫返回的时间(小时)。 返回: int: 最小速度K;如果无法完成则返回0。 """ # 边界条件处理 if sum(piles) > h * max(piles): return 0 # 初始化二查找范围 low, high = 1, max(piles) while low < high: mid = (low + high) // 2 hours_needed = sum((pile - 1) // mid + 1 for pile in piles) if hours_needed > h: low = mid + 1 else: high = mid return low if __name__ == "__main__": import sys input_data = list(map(int, " ".join(sys.stdin.readlines()).strip().split())) n = input_data[:-1] h = input_data[-1] result = min_eating_speed(n, h) print(result) ``` 此程序首先定义了一个函数 `min_eating_speed` 来计算所需的最小进食速率。接着,在主程序部读取标准输入中的数据并调用上述方法得到最终的结果[^1]。 为了使这段代码更易于理解和测,这里提供了一些额外的功能改进建议以及可能的应用场景扩展方向: - **优化边界判断逻辑**:当前版本假设当总桃数大于最大堆乘以时间时就一定不能完成任务,实际上还可以进一步细化其他特殊情况下的快速退出制。 - **增加异常捕获功能**:对于非法输入情况应该给予友好提示而不是简单地抛出错误信息。 - **支持更多交互方式**:除了命令行参数外也可以考虑GUI界面让用户更加直观地操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值