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