Koko loves to eat bananas.  There are N piles of bananas, the i-th pile has piles[i] bananas.  The guards have gone and will come back in H hours.
Koko can decide her bananas-per-hour eating speed of K.  Each hour, she chooses some pile of bananas, and eats K bananas from that pile.  If the pile has less than K bananas, she eats all of them instead, and won't eat any more bananas during this hour.
Koko likes to eat slowly, but still wants to finish eating all the bananas before the guards come back.
Return the minimum integer K such that she can eat all the bananas within H hours.
 
Example 1:
Input: piles = [3,6,7,11], H = 8
Output: 4
Example 2:
Input: piles = [30,11,23,4,20], H = 5
Output: 30
Example 3:
Input: piles = [30,11,23,4,20], H = 6
Output: 23

 
Constraints:

1 <= piles.length <= 10^4
piles.length <= H <= 10^9
1 <= piles[i] <= 10^9

```python

USER_FILENAME = "<user_code>"
import sys, json, builtins
import math, heapq, bisect, itertools, functools, collections, statistics, fractions, decimal, operator, array, random, re, string, os, pathlib
try:
    import resource as _res
except Exception:
    _res = None
from collections import Counter, defaultdict, deque, OrderedDict
from functools import lru_cache, reduce
from itertools import accumulate, permutations, combinations, product
from math import gcd, ceil, floor, sqrt
from decimal import Decimal
try:
    from typing import *
except Exception:
    pass
try:
    sys.setrecursionlimit(1_000_000)
except Exception:
    pass
try:
    import site as _site
    try:
        _sys_sites = _site.getsitepackages() if hasattr(_site, "getsitepackages") else []
        for _p in _sys_sites:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
    try:
        _usp = _site.getusersitepackages()
        if isinstance(_usp, str):
            _usp = [_usp]
        for _p in _usp:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
except Exception:
    pass

def _disabled_input(*args, **kwargs):
    raise RuntimeError("input() is disabled in callable mode")
builtins.input = _disabled_input

ns = {"__name__": "__judge__"}  # prevent if __name__ == "__main__" blocks
for _k, _v in list(globals().items()):
    if not _k.startswith("_"):
        ns[_k] = _v
_CODE = "class Solution():\n    def minEatingSpeed(self, piles: List[int], H: int) -> int:\n        def feasible(speed) -> bool:\n            # return sum(math.ceil(pile / speed) for pile in piles) <= H  # slower        \n            return sum((pile - 1) // speed + 1 for pile in piles) <= H  # faster\n\n        left, right = 1, max(piles)\n        while left < right:\n            mid = left  + (right - left) // 2\n            if feasible(mid):\n                right = mid\n            else:\n                left = mid + 1\n        return left\n\n#SELF TRY 10/7/2020\n# class Solution:\n#     def minEatingSpeed(self, piles: List[int], H: int) -> int:\n#         def eat_speed(K, H):\n#             banana_per_hour = 0 #This is basically the hour it'll take to eat all the bananas. \n#             #Let's say K = 4 \n#             #Pile is 10 \n#             #To eat 4 per hour it takes 3 hours \n#             #You can do pile // K -> 10 // 4 = 2  (8 banana in 2 hours)\n#             #Then pile % K -> 2 remainder is 2 (so since k is 4 then we can eat all the bananas)\n#             for pile in piles: \n#                 banana_per_hour += pile // K\n#                 if pile % K != 0: #You can eat all of it takes an extra hour only \n#                     banana_per_hour += 1 \n#             return banana_per_hour\n            \n            \n            \n#         #inclusive this is what we use for our K value to TRY \n#         left = 1 \n#         right = max(piles) \n        \n#         while left <= right: \n#             K = left + (right - left) // 2 \n#             banana_per_hour = eat_speed(K,H)\n#             if banana_per_hour <= H: #this is fine \n#                 right = K - 1 \n#             else: #banana_per_hour > H #not possible so we need to increase the number of bananas that Koko can eat.\n#                 left = K + 1 \n#         return left \n            \n            \n            \n            \n        \n# class Solution:\n#     def minEatingSpeed(self, piles: List[int], H: int) -> int:\n       \n        \n#         def K_speed(K, piles): \n#             hours_to_eat = 0\n            \n#             for pile in piles: \n#                 hours_to_eat = hours_to_eat + (pile // K)\n#                 if pile % K != 0:\n#                     hours_to_eat += 1\n                    \n                    \n#                 # if pile % K == 0: \n                \n#             return hours_to_eat\n        \n#         #two cases \n#         # 1 < H \n#         #2 == H \n#         left = 1 \n#         right = max(piles)\n#         #other way is inclusive ^ \n#         #but left <= right \n#         # and if that's the case right = K - 1 \n#         #So if you do it <= you know that AT that point hours to eat is <= H we know that there's a possibility of our CURRENT K being a solution\n#         #However in this case you need to do a K - 1 because you are trying to find the next smallest for Koko still eating all bananas.\n#         #Because if our RIGHT becomes < our right we are done \n#         while left < right: \n#             K = left + (right - left) // 2 \n#             if K_speed(K, piles) <= H: \n#                 right = K\n                \n#             else: \n#                 left = K + 1\n               \n                \n#         # LEFT has passed your RIGHT BOUND   \n#         #inclsuvie or exclusive inclsuive w/ one exclusive\n#         #I give you a number that doesn't exist \n#         return left \n    \n    \n    \n#     #BINARY SEARCH \n#     LEFT <= RIGHT: \n        \n        \n        \n#         return LEFT whatever it is your answer \n\n            \n        \n        \n                \n            \n        \n        \n        \n        \n        \n        \n        #monkey eats bananas\n        #there are N piles of bananas \n        #the i-th pile has piles[i] amount of bananas\n        #The guard have gone and will come back in H hours \n        \n        #She has a bananas eating per hour speed K \n        #Each hour she chosses some banans and eats the K bannas in that pile \n        \n#         1) \n        #If the pile has less than K bananas she eats all of them \n        #And won't eat anymore bananas during the hour \n        \n        \n        #Monkey eats slow but needs to finish eating all the bananas before the guard comes back\n        \n        #Return the minimum (int) K s.t she can eat all the bananas within H hours.\n        \n        \n        # \n        #K to try to eat all the piles within that hour \n        \n"
_co = compile(_CODE, USER_FILENAME, "exec")
exec(_co, ns, ns)

_target = None
_fn_name = 'minEatingSpeed'
if _fn_name:
    if "Solution" in ns:
        try:
            _obj = ns["Solution"]()
            if hasattr(_obj, _fn_name):
                _target = getattr(_obj, _fn_name)
        except Exception:
            _target = None
    if _target is None and _fn_name in ns and callable(ns[_fn_name]):
        _target = ns[_fn_name]
# Fallback: if there's exactly one user-defined function, use it
if _target is None:
    _cands = [v for k, v in ns.items() if callable(v) and getattr(v, "__module__", "") in ("__judge__", "__main__")]
    _user_funcs = [c for c in _cands if getattr(c, "__name__", "").startswith("_") is False]
    if len(_user_funcs) == 1:
        _target = _user_funcs[0]
if _target is None:
    raise RuntimeError(f"Could not resolve callable '{_fn_name}'")

_raw = sys.stdin.read().strip()
if _raw:
    _parsed = json.loads(_raw)
    if isinstance(_parsed, dict):
        _kwargs = _parsed.get("kwargs", {})
        _args = _parsed.get("args", [])
    else:
        _args, _kwargs = _parsed, {}
else:
    _args, _kwargs = [], {}
if not isinstance(_args, (list, tuple)):
    _args = [_args]
_res = _target(*_args, **_kwargs)
try:
    sys.stdout.write(repr(_res) + "\n")
except Exception:
    pass

```

Measured memory_bytes: 6098