二分查找
示例:
思路如下:
代码如下:
#每一个桃树需要的时间: (num + x - 1) // x
#所有桃树需要的时间 <=H
#就算吃完了,剩余的时间也不能去下一课桃树,所以每个桃树至少要一个小时
w = list(map(int,input().split()))
h = int(input()) #是守卫回来需要的时间,是 最大用时
n = len(w) # n 是桃树的棵数,每个桃树至少要一个小时,n棵至少要n个小时
if n > h: # 如果 n 大于 h 说明永远不可能在守卫回来之前吃完
print(0)
else:
#下面这个方法是用来判断是否能在守卫回来之前吃完所有的桃子
def check(x): # x 是猴子的吃桃子的速度,x 的最小速度是 k
cnt = 0
for num in w: #num 是每个桃树上桃子的数量
# num // x + (x -1) // x
cnt += (num + x - 1) // x # (num + x - 1) // x 是每棵树所需时间
if cnt > h:
return False
return True
#下面的代码是用来寻找 最小的速度 k
l,r = 1,10**9 #二分查找的左右边界
while l < r:
mid = (l+r) // 2
if check(mid):
r = mid
else:
l = mid + 1
print(l)