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]modx为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