系列文章目录
前言
本人最近再练习算法,所以会发布自己的解题思路,希望大家多指教
一、题目描述
某公司员工食堂以盒饭的方式供餐。
为将员工取餐排队时间降为0,食堂的供餐速度必须要足够快。
现在需要根据以往员工取餐的统计信息,计算出一个刚好能达到排队时间为0的最低供餐速度。
即,食堂在每个单位时间内必须至少做出多少份盒饭才能满足要求。
二、输入描述
第一行输入一个正整数N,表示食堂开餐时长。
第二行为一个正整数M,表示开餐前食堂已经准备好的盒饭数量;
第三行为N个正整数,用空格分割,依次表示开餐时间内按时间顺序每个单位时间进入食堂取餐的人数。
三、输出描述
一个整数,能满足题目要求的最低供餐速度。(每个单位时间需要做出多少份盒饭)。
四、补充说明
每人只能取一份盒饭。
需要满足排队时间为0,必须保证取餐员工到达食堂时,食堂库存盒饭数量不少于本次来取餐的人数。
第一个单位时间来取餐的员工只能取开餐前食堂准备好的盒饭。
每个单位时间里制作的盒饭只能供给后续单位时间来的取餐员工。食堂在每个单位时间里制作的盒饭数量是相同的。
四、java代码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//获取开餐时长
int N = Integer.parseInt(sc.nextLine());
//准备好的盒饭数量
int M = Integer.parseInt(sc.nextLine());
//每个时间段的取餐人数
int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
//计算总人数
int sum = Arrays.stream(arr).sum();
//初始化需要备餐的最大速度 = 总人数 - 已备好的盒饭
int right = sum - M;
//初始化需要备餐的最小速度
int left = 0;
//采用二分法求出最小速度
while (left < right) {
int mid = (right + left) / 2;
if(dfs(arr,mid,M,N)){
right = mid;
} else {
left = mid + 1;
}
}
System.out.println(left);
}
private static boolean dfs(int[] arr, int mid, int m, int n) {
for (int i = 0; i < n; i++) {
//每个时间段生产的只能给下一个时间段的人员使用
m -= arr[i];
//以 mid/时间段内 速度生产的盒饭数量无法满足当前人数需求
if(m < 0){
return false;
}
//下一个时间段的盒饭数量 = 当前时间段消耗剩余的盒饭数 + 当前时间段生产的盒饭数
m += mid;
}
return true;
}
五、测试用例
输入:
3
20
15 12 8
输出: