华为OD统一考试A卷+B卷 新题库说明
你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。
B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。
我将持续更新最新题目
获取更多免费题目可前往夸克网盘下载,请点击以下链接进入:
我用夸克网盘分享了「华为OD题库Java.zip」,点击链接即可保存。打开「夸克APP」
链接:https://pan.quark.cn/s/f59329c0173b
提取码:3p8Y
题目类型:数组
题目描述:
某公司员工食堂以盒饭的方式供餐。
为将员工取餐排队时间降为0,食堂的供餐速度必须要足够快。
现在需要根据以往员工取餐的统计信息,计算出一个刚好能达到排队时间为0的最低供餐速度即,食堂在每个单位时间内必须至少做出多少份盒饭才能满足要求
输入描述
第一行输入一个正整数N,表示食堂开餐时长。
第二行为一个正整数M,表示开餐前食堂已经准备好的盒饭数量
第三行为N个正整数,用空格分割,依次表示开餐时间内按时间顺序每个单位时间进入食堂取餐的人数。
输出描述
一个整数,能满足题目要求的最低供餐速度。(每个单位时间需要做出多少份盒饭)
补充说明
每人只能取一份盒饭。
需要满足排队时间为0,必须保证取餐员工到达食堂时,食堂库存盒饭数量不少于本次来取餐的人数第一个单位时间来取餐的员工只能取开餐前食堂准备好的盒饭每个单位时间里制作的盒饭只能供给后续单位时间来的取餐员工。食堂在每个单位时间里制作的盒饭数量是相同的。
示例
输入
6
20
15 12 8
输出
8
解题思路
1.采用二分法,
2.left为最小出餐速度,right为最大出餐速度 = 总人数-已经准备好的盒饭数量
3.判断是否还剩余盒饭:
4.如果盒饭不够了,返回false;
5.如果盒饭足够,则剩余盒饭数量 = 目前盒饭数量-每个时间段的取餐人数,再加上当前时间段生产的盒饭数量
参考代码:
public static void main(String[] args) {Scanner in = new Scanner(System.in);// 食堂开餐时长int N = in.nextInt();// 开餐前食堂已经准备好的盒饭数量int M = in.nextInt();// 每个单位时间进入食堂取餐的人数int[] P = new int[N];// 总人数int count = 0;for (int i = 0; i < N; i++) {P[i] = in.nextInt();count += P[i];}// 最小出餐速度int left = 0;// 最大出餐速度 = 总人数 - 已经准备好的盒饭数量int right = count - M;while (left < right) {//二分法int mid = (left + right) / 2;// 是否还有剩余盒饭if (check(mid, M, N, P)) {right = mid;} else {left = mid + 1;}}// 最小出餐速度System.out.println(left);
}/*** 是否还有剩余盒饭* @param speed* @param M 已经准备好的盒饭数量* @param N 食堂开餐时长* @param P 每个单位时间进入食堂取餐的人数* @return*/
public static boolean check(int speed, int M, int N, int[] P) {boolean result = true;for (int i = 0; i < N; i++) {// 剩余盒饭数量 = 目前盒饭数量 - 每个时间段的取餐人数M -= P[i];// 如果盒饭不够了,返回falseif (M < 0) {result = false;break;}M += speed;}return result;
}