C ++中的Koko吃香蕉

假设我们有N堆香蕉,第i堆有堆香蕉。这里的警卫已经离开,将在H小时后回来。Koko可以确定她每小时的香蕉进食速度为K。每小时,她会拿一些香蕉,然后从那一堆中吃K香蕉。如果堆中的香蕉少于K个,那么她将全部消耗掉,并且在此小时内不再吃香蕉。考虑到Koko喜欢吃慢一点,但仍然想在警卫回来之前吃完所有香蕉。我们必须找到最小整数K,以便她可以在H小时内吃掉所有香蕉。

因此,如果输入类似于[3,6,7,11],并且H = 8,则输出将为4。

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个名为的方法ok(),它将采用数组a,两个值x和h

  • 时间:= 0

  • 对于0到a大小的范围

    • 时间:=时间+ a [i] / x

    • 时间:=时间+ i,当a [i] mod x为0时

  • 当时间<= H时返回true

  • 从主要方法执行以下操作

  • n:=桩阵列的大小,设置总和:= 0,低:= 1,高:= 0

  • 对于i,范围为0至n – 1

    • 高:=最高桩[i]和高

  • 从低到高

    • 中:=低+(高-低)/ 2

    • 如果ok(piles,mid,H)为true,则将high设置为:= mid,否则将为low设置为Mid + 1

    • 如果ok(piles,mid,H)为true,则将high设置为:= mid,否则将为low设置为Mid + 1

  • 高回报

让我们看下面的实现以更好地理解-

示例

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
   public:
   bool ok(vector <int>& a, int x, int H){
      int time = 0;
      for(int i = 0; i < a.size(); i++){
         time += a[i] / x;
         time += (a[i] % x ? 1 : 0);
      }
      return time <= H;
   }
   int minEatingSpeed(vector<int>& piles, int H) {
      int n = piles.size();
      lli low = 1;
      lli sum = 0;
      lli high = 0;
      for(int i = 0; i < n; i++)high = max((lli)piles[i], high);
      while(low < high){
         int mid = low + (high - low) / 2;
         if(ok(piles, mid, H)){
            high = mid;
         }else{
            low = mid + 1;
         }
      }
      return high;
   }
};
main(){
   vector<int> v = {3,6,7,11};
   Solution ob;
   cout << (ob.minEatingSpeed(v, 8));
}

输入项

[3,6,7,11]
8

输出结果

4