华为OD机试真题- 任务混部

该文章提出了一种算法来解决任务混部问题,旨在最小化资源成本并最大化资源利用率。给定一组任务,每个任务具有开始时间、结束时间和并行度,算法需确定完成所有任务所需的最少服务器数量。通过排序任务并使用优先队列处理不相交区间,最终得出所需服务器的最小数量。
摘要由CSDN通过智能技术生成

题目描述:
公司创新实验室正在研究如何最小化资源成本,最大化资源利用率,请你设计算法帮他们解决一个任务混部问题:有taskNum项任务,每个任务有开始时间(startTime ),结束时间(endTime),并行度(parallelism)三个属性,并行度是指这个任务运行时将会占用的服务器数量,一个服务器在每个时刻可以被任意任务使用但最多被一个任务占用,任务运行完会立即释放(结束时刻不占用)。任务混部问题是指给定一批任务,让这批任务由同一批服务器承载运行,请你计算完成这批任务混部最少需要多少服务器,从而最大化控制资源成本。
输入描述:
第一行输入为taskNum,表示有taskNum项任务
接下来taskNum行,每行三个整数,表示每个任务的开始时间(startTime ),结束时间(endTime),并行度(parallelism)
输出描述:
一个整数,表示最少需要的服务器数量

补充说明:
1<=taskNum<=100000
<=startTime<endTime<=500001=<parallelism<=100 

 示例1

输入:

3

2 3 1

6 9 2

0 5 1

输出:

2

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

int main() {
	int task_num;
	cin >> task_num;

	vector<vector<int>> ranges;
	for (int i = 0; i < task_num; i++) {
		int start, end, value;
		cin >> start >> end >> value;
		ranges.push_back({ start, end, value });
	}

	sort(ranges.begin(), ranges.end());//按区间左端点从小到大排序

	// 定义小根堆,存储已经考虑过但未被完全包含的区间,按右端点从小到大排序
	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;//end,value
	int res = 0, temp_res = 0;
	for (int i = 0; i < ranges.size(); i++) {
		while (!pq.empty()) {
			auto top = pq.top();

			if (top.first < ranges[i][0]) {
				// 当前正在考虑的区间集合与堆顶区间不相交,则弹出堆顶区间
				pq.pop();
				temp_res -= top.second;
			}
			else {
				break;
			}
		}

		pq.push(make_pair(ranges[i][1], ranges[i][2]));
		temp_res += ranges[i][2];

		if (temp_res > res) {
			res = temp_res;
		}
	}

	cout << res << endl;

	return 0;
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值