洛谷P2278 [HNOI2003]操作系统 堆 优先队列

题目链接:https://www.luogu.com.cn/problem/P2278

这里用优先队列,优先级高的优先,如果优先级相等,编号小的优先
这里记一个时间now,每输入一组数据,若队列为空,说明此时CPU未被占用,将该进程放入队列,并更新时间now该进程开始时间time
如果队列不为空,如果时间now+队首执行时间len<=新进程的开始时间time,说明队首进程可以在新进程到来之前完成,出队,直接输出答案now+len,并更新时间now为完成该进程后的时间now+len。重复此操作,直至此时队首的now+len>time,或者队列已经为空。如果队列为空,直接把新进程放入队列,并更新时间now=time。否择,将队首执行时间减少至now+len-time并重新放入队列,再将新进程放入队列,最后更新now=time。
当数据输入完成后,此时队列还不为空,输出答案now+len,更新now=now+len,出队,重复直至队为空。
代码如下

#include <bits/stdc++.h>
using namespace std;
struct node
{
    int num,tim,len,level;
    friend bool operator < (node a,node b)
    {
        if(a.level==b.level)
        return a.num > b.num;
        else
        return a.level < b.level;
    }
};
priority_queue<node>q;
int main()
{
    node t;
    int now;//当前时间
    while(~scanf("%d %d %d %d",&t.num,&t.tim,&t.len,&t.level))
    {
        if(q.empty())
        {
            q.push(t);
            now=t.tim;
        }
        else
        {
            node temp=q.top();
            while(now+temp.len<=t.tim)
            {
                printf("%d %d\n",temp.num,now+temp.len);
                q.pop();
                now+=temp.len;
                if(q.empty())
                break;
                temp=q.top();
            }
            if(q.empty())
            q.push(t),now=t.tim;
            else
            {
                temp.len=now+temp.len-t.tim;
                q.pop();
                q.push(temp);
                q.push(t);
                now=t.tim;
            }
        }
    }
    while(!q.empty())
    {
        node temp=q.top();
        q.pop();
        printf("%d %d\n",temp.num,temp.len+now);
        now+=temp.len;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44491423/article/details/104520579