华为OD机试 2023B卷题库疯狂收录中,刷题点这里
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一个工厂有 m 条流水线,来并行完成 n 个独立的作业,该工厂设置了一个调度系统,在安排作业时,总是优先执行处理时间最短的作业。现给定流水线个数 m,需要完成的作业数 n,每个作业的处理时间分别为 t1.t2…tn。请你
编程计算处理完所有作业的耗时为多少?
当 n>m 时,首先处理时间短的 m 个作业进入流水线,其他的等待,当某个作业完成时,依次从剩余作业中取处理时间最短的进入处理。
第一行为2 个整数 (采用空格分隔),分别表示流水线个数 m 和作业数 n;
第二行输入 n个整数 (采用空格分隔) ,表示每个作业的处理时长 t1,t2…tn。
0< m,n<100,0 注:保证输入都是合法的 输出处理完所有作业的总时长。 3 5 13 4 6 29 下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分) 本文收录于,华为OD机试(JAVA)真题(A卷+B卷) 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。三、输出描述
1、输入
8 4 3 2 102、输出
3、说明
四、解题思路
五、Java算法源码
package com.guor.od;
import java.util.*;
public class OdTest01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] line = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
// 流水线个数 m
int m = line[0];
// 作业数 n
int n = line[1];
// 每个作业的处理时长
int[] timeArr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
// 有小到大排序
Arrays.sort(timeArr);
/**
* 特殊情况:
* 流水线 大于等于 独立的作业时,可以直接处理,不需要等待排队
* 直接返回独立作业最长的处理时间即可
*/
if (m >= n) {
System.out.println(timeArr[timeArr.length - 1]);
return;
}
// 当 n>m 时,首先处理时间短的 m 个作业进入流水线,其他的等待
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < timeArr.length; i++) {
// m条流水线同时处理作业
int key = i % m;
map.put(key, map.getOrDefault(key, 0) + timeArr[i]);
}
// 处理完所有作业的总时长
int sum = 0;
for (Integer value : map.values()) {
sum = Math.max(sum, value);
}
// 输出处理完所有作业的总时长
System.out.println(sum);
}
}
六、效果展示
1、输入
10 20 15 12 8 92、输出
3、说明