LeetCode 875-Koko Eating Bananas(二分,最优化(最大值最小))

LeetCode 875-Koko Eating Bananas

题干:

给定一堆香蕉,共 n n n串,第 i i i串香蕉有piles[i]根,Koko想把这堆香蕉在 h h h小时内全部吃完。

她吃香蕉的速度是 k k k根/小时,一小时内最多只吃一串里的香蕉。如果吃完了这串,该小时内也不再吃别的了;如果吃不完,剩余的就放在别的小时里吃。求她能在 h h h小时内全部吃完的最小速度 k k k

Input: piles = [3,6,7,11], h = 8
Output: 4

解:

设Koko吃香蕉的速度为 x x x根/小时。可以得到,速度越大,越快吃完香蕉,花费的小时数越少;速度越小,越慢吃完,花费的小时数越大。 所以吃香蕉的速度和花费的时间是一个单调不递增函数关系。

所以,可以定义 f ( x ) f(x) f(x)函数为:以 x x x根/小时的速度吃香蕉,所花费的小时数。

又由题,需要限制 f ( x ) ≤ h f(x)\le h f(x)h

所以该题所求的是:满足 f ( x ) ≤ h f(x)\le h f(x)h的条件下的最小 x x x。画图可得求的是左边界。

x x x的取值范围:left=1, right=max(piles[i])

long long f(vector<int>& piles, int x){
        long long hour = 0;
        for(auto i: piles){
            hour += i/x;
            if(i%x) ++hour;
        }
        return hour;
    }

int minEatingSpeed(vector<int>& piles, int h) {
        int left = 1, right = 1e9 + 1; //最小速度为1,最大速度为取值范围最大值(或给定数组的最大值)
        int ans = 1e9;

        while(left < right){
            int mid = left + ((right - left) >> 1);
            long long hour = f(piles, mid);
            if(hour <= h){
                ans = mid;
                right = mid;
            }
            else if(hour > h) left = mid + 1;
        }
        return ans;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值