华为OD机试 2023B卷题库疯狂收录中,刷题点这里
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
给定一个正整数数组表示待系统执行的任务列表,数组的每一个元素代表一个任务,元素的值表示该任务的类型。
请计算执行完所有任务所需的最短时间。
任务执行规则如下
说明:数组最大长度为1000,速度最大值1000。
第一行记录一个用半角逗号分隔的数组,数组长度不超过1000,数组元素的值不超过1000。第二行记录任务冷却时间,N为正整数,N<=100。
输出为执行完所有任务所需的最短时间。
2,2,2,3
2
7
因为任务有冷却时间,为了缩短冷却时间,任务数量多的应该先执行。
public class OdTest02 {
static int coolingTime = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 若干个任务
String[] taskArr = sc.nextLine().split(",");
/**
* key:任务编号
* value:任务数量,冷却时间
* 冷却时间说明:
* 未执行的任务,默认-1
* 执行的任务,默认为coolingTime
* 每执行一个任务,-1
*/
Map<String, String> map = new HashMap<>();
for (int i = 0; i < taskArr.length; i++) {
String task = taskArr[i];
Integer sum = 0;
if (map.containsKey(task)) {
sum = Integer.valueOf(map.get(task).split(",")[0]);
}
sum++;
map.put(task, sum+","+(-1));
}
// 冷却时间
coolingTime = Integer.valueOf(sc.nextLine());
// 搜索任务数量最多 且不处于冷却时间的任务 去执行
dfs(map);
System.out.println(builder.deleteCharAt(builder.length()-1));
System.out.println(builder.toString().split(",").length);
}
// 加入执行的任务列表
static StringBuilder builder = new StringBuilder();
/**
* 搜索任务数量最多 且不处于冷却时间的任务 去执行
*/
private static void dfs(Map<String, String> map) {
// 如果任务列表为空,则停止搜索
if(map.size() == 0){
return;
}
String maxTask = getMaxTask(map);
if(!maxTask.equals("wait")){
String value = map.get(maxTask);
int sum = Integer.valueOf(value.split(",")[0]);
sum--;
if(sum > 0){
map.put(maxTask,sum + "," + coolingTime);
}else{
map.remove(maxTask);
}
}
builder.append(maxTask).append(",");
// 搜索任务数量最多 且不处于冷却时间的任务 去执行
dfs(map);
}
/**
* 任务执行的条件:
* 1. 为了缩短冷却时间,任务数量多的应该先执行
* 2. 不处于冷却时间内
*/
private static String getMaxTask(Map<String, String> map) {
// 满足条件的待执行任务
String maxTask = "wait";
Integer maxValue = -1;
for (Map.Entry<String,String> entry : map.entrySet()) {
// 任务数量
int sum = Integer.valueOf(entry.getValue().split(",")[0]);
// 任务冷却时间
int cool = Integer.valueOf(entry.getValue().split(",")[1]);
// 任务数量最多 and 不处于冷却时间内
if (sum > maxValue && cool<=0) {
maxTask = entry.getKey();
maxValue = sum;
}
// 处于冷却时间内的任务,冷却时间-1
if(cool > 0){
cool--;
map.put(entry.getKey(),sum + "," + cool);
}
}
return maxTask;
}
}
2,2,3,2,3,3,4,4,5
3
10
🏆下一篇:华为OD机试 - 最长的顺子 - 感谢@禁止你发言提供的更简便算法(Java 2023 B卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。