码迷,mamicode.com
首页 > 编程语言 > 详细

b_lc_单线程 CPU(堆)

时间:2021-04-20 14:58:36      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:pre   完整   return   size   cpp   没有   最小   class   int   

有n个任务,且tasks[i] = [enqueueTimei, processingTimei] 意味着第 i?????????? 项任务将会于 enqueueTimei 时进入任务队列,需要 processingTimei 的时长完成执行。现有一个单线程 CPU ,同一时间只能执行 最多一项 任务,该 CPU 将会按照下述方式运行:

  • 如果 CPU 空闲,且任务队列中没有需要执行的任务,则 CPU 保持空闲状态。
  • 如果 CPU 空闲,但任务队列中有需要执行的任务,则 CPU 将会选择 执行时间最短 的任务开始执行。如果多个任务具有同样的最短执行时间,则选择下标最小的任务开始执行。
  • 一旦某项任务开始执行,CPU 在 执行完整个任务 前都不会停止。
  • CPU 可以在完成一项任务后,立即开始执行一项新任务。

返回 CPU 处理任务的顺序。

const int N=1e5+5;
struct node{
    int id, inqTime, time;
}A[N];
struct cmp{
    bool operator()(node& a, node& b){
        if (a.time != b.time)
            return a.time > b.time;
        return a.id > b.id;
    }
};
bool cmp1(const node &a, const node &b){
    return a.inqTime < b.inqTime;
}
class Solution {
public:
    vector<int> getOrder(vector<vector<int>>& ts) {
        int n = ts.size();
        vector<int> ans(n);

        for (int i=0; i<n; i++) A[i] = {i, ts[i][0], ts[i][1]};
        sort(A, A+n, cmp1);
        priority_queue<node, vector<node>, cmp> q;
        
        long long j = 0, cur = 0;
        for (int i = 0; i < n || !q.empty(); ) {
            if (q.empty()) {
                cur = max(cur, (long long) A[i].inqTime);
            }
            while (i < n && A[i].inqTime <= cur) q.push(A[i++]); //只要当期任务的入队时机在我的执行时间cur前面,就需要入队等待
            ans[j++] = q.top().id; //所有任务都入队完毕,选一个执行时间最少的执行
            cur += q.top().time;
            q.pop();
        }
        return ans;
    }
};

b_lc_单线程 CPU(堆)

标签:pre   完整   return   size   cpp   没有   最小   class   int   

原文地址:https://www.cnblogs.com/wdt1/p/14673181.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!