875. Koko Eating Bananas

class Solution(object):
    def minEatingSpeed(self, piles, h):
        left = 1
        right = max(piles)
        
        while left < right:
            mid = (left + right) // 2
            if self.canEatAll(piles, mid, h):
                right = mid
            else:
                left = mid + 1
        
        return left
    
    def canEatAll(self, piles, speed, h):
        time = 0
        for pile in piles:
            time += math.ceil(1.0 * pile / speed)
            if time > h:
                return False
        return True