题目描述
孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有 N 棵桃树,每颗树上都有桃子,守卫将在 H 小时后回来。
孙悟空可以决定他吃蟠桃的速度K(个/小时),每个小时选一颗桃树,并从树上吃掉 K 个,如果树上的桃子少于 K 个,则全部吃掉,并且这一小时剩余的时间里不再吃桃。
孙悟空喜欢慢慢吃,但又想在守卫回来前吃完桃子。
请返回孙悟空可以在 H 小时内吃掉所有桃子的最小速度 K(K为整数)。如果以任何速度都吃不完所有桃子,则返回0。
输入描述
第一行输入为 N 个数字,N 表示桃树的数量,这 N 个数字表示每颗桃树上蟠桃的数量。
第二行输入为一个数字,表示守卫离开的时间 H。
其中数字通过空格分割,N、H为正整数,每颗树上都有蟠桃,且 0 < N < 10000,0 < H < 10000。
输出描述
吃掉所有蟠桃的最小速度 K,无解或输入异常时输出 0。
用例1
输入
2 3 4 5
4
输出
5
用例2
输入
2 3 4 5
3
输出
0
用例3
输入
30 11 23 4 20
6
输出
23
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] strNums = in.nextLine().split(" ");
int[] nums = Arrays.stream(strNums).mapToInt(Integer::parseInt).toArray();
int period = in.nextInt();
int min = 1;
int max = 1;
for(int num:nums){
if(num >= max) max = num;
}
if(nums.length > period) {System.out.print(0); return;} //桃子吃不完,返回0
if(nums.length == period){System.out.print(max); return;} //桃子树和返回时间相同
System.out.println(getNum(nums, period, min, max));
}
public static int getNum(int[]nums, int period, int min, int max){
int mid = (min+max)/2;
if(mid == min) return max;
int size = 0;
for(int num: nums){
size = (int)Math.ceil((double)num/mid) + size; //计算总耗时
}
if(size > period){
min = mid;//总耗时大于守卫回来时间,min=mid,往右继续寻找最优值
return getNum(nums, period, min, max);
}
if(size <= period){
max = mid; //总耗时小于等于守卫回来时间,max=mid,往左继续寻找最优值
return getNum(nums, period, min, max);
}
return 0;
}
}