题目链接: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;
}