package org.example;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* 猴子吃桃
*
* @author zey
* @since 2022-06-12
*/
public class MonkeyEatPeach {
/*
猴子吃桃
题目描述:
孙悟空喜欢吃蟠桃,一天他乘守卫蟠桃园的天兵天将离开了而偷偷的来到王母娘娘的蟠桃园偷吃蟠桃。
已知蟠桃园有 N 棵蟠桃树,第 i 棵蟠桃树上有 N[i](大于 0)个蟠桃,天兵天将将在 H(不小于蟠桃树棵数)小时后回来。
孙悟空可以决定他吃蟠桃的速度 K(单位:个/小时),每个小时他会选择一颗蟠桃树,从中吃掉 K 个蟠桃,如果这棵树上的蟠桃数小于 K,他将吃掉这棵树上所有蟠桃,然后这一小时内不再吃其余蟠桃树上的蟠桃。
孙悟空喜欢慢慢吃,但仍想在天兵天将回来前将所有蟠桃吃完。
求孙悟空可以在 H 小时内吃掉所有蟠桃的最小速度 K(K 为整数)。
输入描述:
从标准输入中读取一行数字,前面数字表示每棵数上蟠桃个数,最后的数字表示天兵天将将离开的时间。
输出描述:
吃掉所有蟠桃的 最小速度 K(K 为整数)或 输入异常时输出 -1。
示例 1:
输入
3 11 6 7 8
输出
4
说明:
天兵天将8个小时后回来,孙悟空吃掉所有蟠桃的最小速度4。
第1小时全部吃完第一棵树,吃3个,
第2小时吃4个,第二棵树剩7个,
第3小时吃4个,第二棵树剩3个,
第4小时吃3个,第二棵树吃完,
第5小时吃4个,第三棵树剩2个,
第6小时吃2个,第三棵树吃完,
第7小时吃4个,第4棵树剩3个,
第8小时吃3个,第4棵树吃完。
思路分析
*/
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String[] argArr = input.nextLine().split(" ");
int length = argArr.length;
int hour = Integer.parseInt(argArr[length - 1]);
List<Integer> peachList = new ArrayList<>();
for (int i = 0; i < argArr.length - 1; i++) {
peachList.add(Integer.valueOf(argArr[i]));
}
peachList.sort(Integer::compareTo);
int left = 1;
int right = peachList.get(peachList.size() - 1);
while (left < right) {
int mid = (left + right) / 2;
if (timeEnough(peachList, hour, mid)) {
right = mid;
} else {
left = mid + 1;
}
}
System.err.println(left);
}
private static boolean timeEnough(List<Integer> peachList, int hour, int speed) {
int count = 0;
for (Integer num : peachList) {
count = count + (num / speed) + (num % speed == 0 ? 0 : 1);
}
return count <= hour;
}
}