流水线 - 华为OD2025B卷刷题记录
题目描述
一个工厂有m条流水线,来并行完成n个独立的作业,该工厂设置了一个调度系统,在安排作业时,总是优先执行处理时间最短的作业。
现给定流水线个数m,需要完成的作业数n, 每个作业的处理时间分别为t1,t2…tn。请你编程计算处理完所有作业的耗时为多少?
当n>m时,首先处理时间短的m个作业进入流水线,其他的等待,当某个作业完成时,依次从剩余作业中取处理时间最短的进入处理。
输入描述
第一行为2个整数(采用空格分隔),分别表示流水线个数m和作业数n;
第二行输入n个整数(采用空格分隔),表示每个作业的处理时长t1,t2…tn。
0< m,n<100,0<t1,t2…tn<100。
注:保证输入都是合法的。
输出描述
输出处理完所有作业的总时长。
用例1
输入
3 5
8 4 3 2 10
输出
13
说明
1、先安排时间为2、3、4的3个作业。
2、第一条流水线先完成作业,然后调度剩余时间最短的作业8。
3、第二条流水线完成作业,然后调度剩余时间最短的作业10。
4、总工耗时就是第二条流水线完成作业的时间13(3+10)。
参考题库
题解代码
#include<iostream>
#include<vector>
#include<string>
#include <utility>
#include <sstream>
#include<algorithm>
#include<queue>
using namespace std;
int main() {
int n,m;
cin >> m >> n;
vector<int> ans(n);
for (int i = 0; i < n; i++) {
cin >> ans[i];
}
// 按照时间进行排序
sort(ans.begin(), ans.end());
if (n <= m) {
cout << ans[n-1];
return 0;
}
int res = 0;
// 小顶堆
priority_queue<int, vector<int>, greater<int>> pq;
for (int i = 0; i < n; i++) {
// 开头m并行
if (i < m){
pq.push(ans[i]);
res = max(res, ans[i]);
// 有流水线出现空闲 添加新的空闲任务
} else {
int top = pq.top();
pq.pop();
top += ans[i];
pq.push(top);
res = max(res, top);
}
}
cout << res;
return 0;
}
#华为OD##华为od##华为OD机试2025B卷#