मान लीजिए हमारे पास N केले के ढेर हैं, i-वें ढेर में piles[i] केले हैं। यहां गार्ड चले गए हैं और H घंटे में वापस आएंगे। कोको अपनी केले-प्रति-घंटा खाने की गति K तय कर सकती है। प्रत्येक घंटे, वह केले के किसी ढेर को लेती है, और उस ढेर से K केले खाती है। यदि ढेर में K से कम केले हैं, तो वह उन सभी को खा लेती है, और उस घंटे में और केले नहीं खाएगी। कोको धीरे खाना पसंद करती है, लेकिन फिर भी गार्ड के वापस आने से पहले सभी केले खत्म करना चाहती है। हमें न्यूनतम पूर्णांक K खोजना है जैसे कि वह H घंटे के भीतर सभी केले खा सके।
उदाहरण के लिए, यदि इनपुट [3,6,7,11] है और H = 8, तो आउटपुट 4 होगा।
समाधान दृष्टिकोण
ok() विधि: दिए गए गति x पर सभी केले खाने में लगने वाला समय ≤ H है या नहीं जांचें
समय = Σ(piles[i]/x + (piles[i]%x ? 1 : 0)) की गणना करें
बाइनरी सर्च: low=1, high=max(piles)
mid = (low+high)/2, यदि ok(mid) तो high=mid अन्यथा low=mid+1
high लौटाएं
C++ कार्यान्वयन
#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 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;
}
};
int main(){
vector<int> v = {3,6,7,11};
Solution ob;
cout << (ob.minEatingSpeed(v, 8));
return 0;
}
इनपुट
[3,6,7,11] 8
आउटपुट
4