【机考刷题】爱吃香蕉的珂珂

解答:

如果珂珂在 H 小时内吃掉所有香蕉的最小速度是每小时 k 个香蕉,则当吃香蕉的速度大于每小时 k 个香蕉时一定可以在 小时H 小时内吃掉所有香蕉,当吃香蕉的速度小于每小时 k 个香蕉时一定不能在 小时H 小时内吃掉所有香蕉。

由于吃香蕉的速度和是否可以在规定时间内吃掉所有香蕉之间存在单调性,因此可以使用二分查找的方法得到最小速度 k。

由于每小时都要吃香蕉,即每小时至少吃 1 个香蕉,因此二分查找的下界是 1;由于每小时最多吃一堆香蕉,即每小时吃的香蕉数目不会超过最多的一堆中的香蕉数目,因此二分查找的上界是最多的一堆中的香蕉数目。

然后我们尝试某个中点速度k:(1) 如果以这个速度能够在h小时内吃完香蕉就记录一下这个速度,然后往这个速度的左边查找(看能不能再慢一点);(2) 否则就到这个速度的右边查找,看再快点能不能在h小时内吃完香蕉。

官方题解代码

class Solution {
public:
    int minEatingSpeed(vector<int>& piles, int h) {
        int low = 1;
        int high = 0;
        for (int pile : piles) {
            high = max(high, pile);
        }
        int k = high;
        while (low < high) {
            int speed = (high - low) / 2 + low;//或者int speed = (high - low)>>1 + low;
            long time = getTime(piles, speed);
            if (time <= h) {
                k = speed;
                high = speed;
            } else {
                low = speed + 1;
            }
        }
        return k;
    }

    long getTime(const vector<int>& piles, int speed) {
        long time = 0;
        for (int pile : piles) {
            int curTime = (pile + speed - 1) / speed;
            time += curTime;
        }
        return time;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/koko-eating-bananas/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

posted @ 2023-12-25 18:16  FBshark  阅读(6)  评论(0编辑  收藏  举报