初学24个题2_孙悟空吃蟠桃

二分查找

示例:

思路如下:

代码如下:

#每一个桃树需要的时间: (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)






  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值