<p>Koko loves to eat bananas. There are <code>n</code> piles of bananas, the <code>i<sup>th</sup></code> pile has <code>piles[i]</code> bananas. The guards have gone and will come back in <code>h</code> hours.</p>

<p>Koko can decide her bananas-per-hour eating speed of <code>k</code>. Each hour, she chooses some pile of bananas and eats <code>k</code> bananas from that pile. If the pile has less than <code>k</code> bananas, she eats all of them instead and will not eat any more bananas during this hour.</p>

<p>Koko likes to eat slowly but still wants to finish eating all the bananas before the guards return.</p>

<p>Return <em>the minimum integer</em> <code>k</code> <em>such that she can eat all the bananas within</em> <code>h</code> <em>hours</em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> piles = [3,6,7,11], h = 8
<strong>Output:</strong> 4
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> piles = [30,11,23,4,20], h = 5
<strong>Output:</strong> 30
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> piles = [30,11,23,4,20], h = 6
<strong>Output:</strong> 23
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= piles.length &lt;= 10<sup>4</sup></code></li>
	<li><code>piles.length &lt;= h &lt;= 10<sup>9</sup></code></li>
	<li><code>1 &lt;= piles[i] &lt;= 10<sup>9</sup></code></li>
</ul>

class Solution {
public:
    int minEatingSpeed(vector<int>& piles, int h) {
        long long ans = INT_MAX;
        int d = 0;
        int max = INT_MIN;
        long long sum = 0;
        for(int i=0; i<piles.size(); ++i) {
            if(max < piles[i]) max = piles[i];
            sum = sum+piles[i];
        }
        int lo;
        if((sum % h) == 0) lo = (sum/h);
        else lo = (sum/h)+1;
        if(piles.size()==1) return lo;
        int hi = max;
        long long mid;
        while(lo<=hi) {
            mid = lo+ ((hi-lo)/2);
            int i=0;
        int temp = h;
        vector <int> v = piles;
        while(temp>0 && i<piles.size()) {
            if(v[i] <= mid) {
                i++;
                temp--;
            }
            else {
                if(v[i]%mid == 0) temp = temp-(v[i]/mid);
                else temp = temp - ((v[i]/mid)+1);
                i++;
            }
        }
        if(i==piles.size() && temp == 0) {
            ans = min(ans, mid);
            hi = mid-1;
        }
        else if(i==piles.size() && temp > 0) {
             ans = min(ans, mid);
            hi = mid-1;
        }
        else if(i<piles.size() && temp==0) lo = mid+1;
        else if(temp < 0) lo = mid+1;
        }
        
        return ans;
        
    }
};
37300