zoukankan      html  css  js  c++  java
  • 875. Koko Eating Bananas

    问题:

    Koko吃香蕉的速度为K,

    有一组香蕉盘piles,每个盘里装有不同数量的香蕉,

    每小时Koko可以选择一盘吃完。

    若这一盘<K,那么这一小时Koko只能吃到这一盘数量的香蕉。

    若这一盘>K,那么这一小时Koko吃了K个香蕉。下一小时,继续吃完这一盘。

    求在给定的H小时中,吃完所有香蕉,最小的食用速度K。

    Example 1:
    Input: piles = [3,6,7,11], H = 8
    Output: 4
    
    Example 2:
    Input: piles = [30,11,23,4,20], H = 5
    Output: 30
    
    Example 3:
    Input: piles = [30,11,23,4,20], H = 6
    Output: 23
    
    Constraints:
    1 <= piles.length <= 10^4
    piles.length <= H <= 10^9
    1 <= piles[i] <= 10^9
    

      

    解法:二分查找(Binary Search)

    根据题意,本问题的

    • 最小速度l:0
    • 最大速度r:盘中最大香蕉数。max(piles)

    寻找m使得,

    用m的速度,消耗完所有piles所用时间 h<=H

    要找从最小速度到最大速度中,第一个(最小速度)能够使得 h<=H 满足的m

    代码参考:

     1 class Solution {
     2 public:
     3     //all piles will be eaten up by the time <=H
     4     int minEatingSpeed(vector<int>& piles, int H) {
     5         int l = 1, r = INT_MIN;
     6         for(int pile: piles) r=max(r,pile)+1;
     7         while(l<r) {
     8             int m = l+(r-l)/2;
     9             int h  = 0;
    10             for(int pile:piles) {
    11                 if(pile <= m) h++;
    12                 else {
    13                     h+=(pile/m);
    14                     h+=(pile%m?1:0);
    15                 }
    16             }
    17             if(h<=H) {//find first K: h<=H
    18                 r = m;
    19             } else {
    20                 l = m+1;
    21             }
    22         }
    23         return l;
    24     }
    25 };
  • 相关阅读:
    PHP命令行执行程序php.exe使用及常用参数
    如何搜百度云盘里别人分享的文件
    WIN8下笔记本共享热点的设置
    COMPANY_点取消会卡死的解决方法
    python urllib
    windows技术
    五分钟搞定Linux容器
    分分钟教你制作完美的虚拟机镜像
    事件日志监控工具推荐
    Linux服务器管理员必备Linux命令TOP5
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13495780.html
Copyright © 2011-2022 走看看