2024华为OD机试题库-(C卷+D卷)-(JAVA、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。
用例1
输入
2 3 4 5
4
输出
5
用例2
输入
2 3 4 5
3
输出
0
考点
二分查找
解题思路
我们可以在速度的范围 [1, max_piles] 中进行二分查找,
每次取中间值 mid 作为孙悟空的吃蟠桃速度,然后计算以该速度吃蟠桃需要的时间。
如果时间小于等于给定的时间 h,说明孙悟空可以在给定时间内吃完所有蟠桃,
我们可以尝试更小的速度;否则说明孙悟空不能在给定时间内吃完所有蟠桃,
我们需要尝试更大的速度。最终,当速度的范围缩小到只剩下一个数时,
该数就是孙悟空吃蟠桃的最小速度。
代码
python
import math
vec=list(map(int,input().split()))
h=int(input())
low=1
hi=vec[0]
for i in vec:
hi=max(i,hi)
if len(vec