系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、补充说明
- 四、java代码
- 五、测试用例
前言
本人最近再练习算法,所以会发布自己的解题思路,希望大家多指教
一、题目描述
某公司员工食堂以盒饭的方式供餐。
为将员工取餐排队时间降为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
输出: