本文收录于「2025华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!!
提醒:拒绝一切代考/替考,违法必究!本人所写题库均搜集于互联网。
订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅读使用!
具体题目描述如下:
公司创新实验室正在研究如何最小化资源成本,最大化盗源利用率,请你设计算法帮他们解决一个任务温部问题:有taskNum顶任务,每个任务有开始时间(startTime),结束时间(endTime),并行度(paralelism)三个属性,并行度是指这个任务运行时将会占用的服务器数量,一个服务器在每个时刻可以被任意任务使用但最多被一个任务占用,任务运行完成立即释放(结束时刻不占用)。任务混部问题是指给定一批任务,让这批任务由同一批服务器承载运行,请你计算完成这批任务混部最少需要多少服务器从而最大最大化控制资源成本
温馨提醒: 大家在参加华为OD机试时,切记不要仅仅死记硬背题解代码。真正的通过率取决于你对代码的理解能力。建议你在理解基本原理和逻辑的基础上,模仿并自己编写代码,这样才能更有效地应对机试。
第一行输入为taskNum,表示有taskNum项任务
接下来taskNum行,每行三个整数,表示每个任务的开始时间
(startTime),结束时间(endTime),并行度(parallelism)
一个整数,表示最少需要的服务器数量
输入:
3
2 3 1
6 9 2
0 5 1
输出:
2
示例说明:
一共有三个任务,第一个任务在时间区间【2,3】运行,占用1个服务器,
第二个任务在时间区间【6,9】运行,占用2个服务器,
第三个任务在时间区间【0,5】运行,占用1个服务器,需要最多服务器的时间。
区间为【2,3】和【6,9】,需要2个服务器。
输入:
2
3 9 2
4 7 3
输出:
5
示例说明:
一共两个任务,第一个任务在时间区间【3,9】运行,占用2个服务器,第二个任务在时间区间【4,7】运行,占用3个服务器,需要最多
服务器的时间区间为【4,7】,需要5个服务器。
备注:
1 <= taskNum <= 100000
0 <= startTime < endTime <= 50000
1 <= parallelism <= 100
输入:
输出:
示例说明:
题目描述的是公司正在进行任务分配,每个任务都有一个时间段,以及并行执行度。我们需要计算最少需要多少个服务器才能同时执行所有任务,并且计算过程中,任务的执行时间不能重叠。如果多个任务的时间段存在重叠,那么就需要更多的服务器来处理它们。
根据如上题解思路,进行代码实战,大家请看如下,建议不要死记硬背代码,要理解其题型及实现思路,别担心,代码我都会给出超详细注释,你一定能看明白的。
package com.demo.java.OD601_650.OD614;
import java.util.Scanner;
import java.util.*;
/**
* @author bug菌
* @Source 公众号:猿圈奇妙屋
* @des: 【最大化控制资源成本(B卷-100分)】问题
* @url: https://blog.csdn.net/weixin_43970743/article/details/146606540
*/
public class OdMain {
public static void main(String[] args) {
// 输入处理
Scanner in = new Scanner(System.in);
int n = in.nextInt(); // 任务数量
int[][] ranges = new int[n][3]; // 用二维数组存储每个任务的时间段和并行度
for (int i = 0; i < n; i++) {
ranges[i][0] = in.nextInt(); // 任务开始时间
ranges[i][1] = in.nextInt(); // 任务结束时间
ranges[i][2] = in.nextInt(); // 任务的并行度
}
// 调用最少服务器计算方法并输出结果
System.out.println(minMeetingRooms(ranges));
}
// 计算最少服务器数的函数
public static int minMeetingRooms(int[][] ranges) {
// 按照任务的开始时间进行排序
Arrays.sort(ranges, (a, b) -> a[0] - b[0]);
// 使用优先队列来存储当前正在执行的任务的结束时间和并行度
PriorityQueue<Integer[]> pq = new PriorityQueue<>((a, b) -> a[0] - b[0]);
int res = 0; // 记录最少需要的服务器数
int temp_res = 0; // 临时记录当前并发使用的服务器数
// 遍历所有任务
for (int i = 0; i < ranges.length; i++) {
// 检查并清除已完成的任务
while (pq.size() > 0) {
Integer[] top = pq.peek();
// 如果队列中最早完成的任务结束时间小于当前任务的开始时间,说明可以复用这个服务器
if (top[0] < ranges[i][0]) {
Integer[] poll = pq.poll(); // 移除已完成的任务
temp_res -= poll[1]; // 减去该任务的并行度
} else {
break; // 如果没有任务结束,退出循环
}
}
// 将当前任务加入队列
pq.offer(new Integer[]{ranges[i][1], ranges[i][2]});
temp_res += ranges[i][2]; // 增加当前任务的并行度
// 更新最小服务器数
if (temp_res > res) {
res = temp_res;
}
}
return res; // 返回最少需要的服务器数
}
}
时间复杂度:
空间复杂度:
首先,我们将输入的任务按开始时间排序,这样可以确保我们按顺序处理每个任务。接着,我们使用一个最小堆(优先队列)来记录当前执行中的任务。堆中的元素是任务的结束时间和并行度。对于每个任务,我们检查堆中最早结束的任务是否已经完成,如果已完成,则可以重用服务器;如果未完成,则需要分配新的服务器。在处理过程中,我们实时更新当前的服务器需求数,并更新最小服务器数。
3
2 3 1
6 9 2
0 5 1
2
根据本地代码进行方法测试,本地运行结果展示如下:
2
3 9 2
4 7 3
5
根据本地代码进行方法测试,本地运行结果展示如下:
根据本地代码进行方法测试,本地运行结果展示如下:
针对如上分享OD机试真题之外,这里我还开源全部OD机试原真题源码,供同学们一对一学习!对照每题都有题目号及详细代码注释。Gitee,例如题序号为1,则题解代码对应文件夹OD1,题序号为5,则题解代码对应文件夹OD5,以此类推,目的就是为了方便大家学习,一举上岸!(这里的题序号指专栏导航贴中表格一列的序号)
如果你还想学习更多相关OD真题题解,都建议直接毫不犹豫地学习此专栏「2025华为OD机试真题(全栈版)」,快速掌握Java、Python、C++、JavaScript等多种热门语言详细解题,快速突破华为OD机试,实现高分目标。还将提供线上多端答疑交流,解决你的所有问题!
注意: 上述任意专栏一次订阅,获永久免费阅读权限,后续更新都能学习。
提示: 拒绝一切形式的代考,替考行为,务必诚信考试!!!本人所写题库均搜集于互联网。
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主&最具价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。
-End-