流水线 - 华为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卷#
全部评论

相关推荐

评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务