public class Solution {
    public int MinEatingSpeed(int[] piles, int h) {
        double getTotal(int hourly) => piles.Sum(p => double.Ceiling(p / (double)hourly));

        int answer = -1;

        int low = 1, high = piles.Max();
        while (low <= high) {
            var mid = (low + high) / 2;
            var total = getTotal(mid);

            if (total <= h) {
                answer = mid;
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }

        return answer;
    }
}