package com.company;
// 2022-1-19
import java.util.Arrays;
class Solution {
public int minEatingSpeed(int[] piles, int h) {
// 注意这里最小值是1, 每小时至少吃掉1个
int min = 1;
int max = Arrays.stream(piles).max().getAsInt();
// System.out.println(getMin(piles, min, max, h));
return getMin(piles, min, max, h);
}
private int getMin(int[] piles, int min, int max, int h) {
while (min < max){
int mid = (max + min) / 2;
// 如果刚好满足条件,则直接返回 mid
if (check(piles, mid, h) == h ) {
return mid;
// 如果返回的时间过短,则需要提高mid的值
}else if (check(piles, mid, h) < h ) {
max = mid;
}else {
min = mid + 1;
}
}
// 如果没有,则返回最小的值
return min;
}
private int check(int[] piles, int mid, int h){
// 如果满足条件
int count = 0;
int sum = 0;
for (int i = 0; i < piles.length; i++){
// 题目说了, 小于/等于k 还是会消耗1H
if (piles[i] <= mid) {
count++;
continue;
}
// 计算天数
int shang = piles[i] / mid;
if (count + shang > h) return count + shang;
count += shang;
// 获取剩余的余数
int yushu = piles[i]%mid;
sum += yushu;
}
// 如果剩余的天数可整除, 则累加
int tmp = sum%mid;
if( tmp == 0){
count += sum / mid;
}else {
// 如果剩余的天数不可整除, 则需要多+1
count += sum / mid;
count += 1;
}
// 返回在mid速度下需要的天数
return count;
}
}
public class Test {
public static void main(String[] args) {
new Solution().minEatingSpeed(new int[]{3,6,7,11}, 8); // 输出: 4
new Solution().minEatingSpeed(new int[]{30,11,23,4,20}, 5); // 输出: 30
new Solution().minEatingSpeed(new int[]{30,11,23,4,20}, 6); // 输出: 23
}
}