假设我们有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