链接:Miku
---------------------------------
一道巨大的模拟,因为每次都是从第一个开始干并且有顺序,那么就该用优先队列了
顺序问题只要重载一下运算符即可
--------------------------------------
CPU的任务如果干了一部分后被踢出去了,又轮到它的时候它会接着干而不是从头开始
-----------------------------------------
#include<iostream> #include<cstdio> #include<algorithm> #include<queue> using namespace std; long long num,at,rt,l; //编号,到达时间,运行时间,级别 struct task{ long long l; long long num; long long at; long long rt; long long al;//已经完成部分 friend bool operator < (task a,task b){ if(a.l==b.l){ return a.at>b.at; } return a.l<b.l; } } now,last; long long lt,nt;//上一个程序处理到的时候,目前已处理时间长度 priority_queue <task>q; int main(){ while(scanf("%d%d%d%d",&now.num,&now.at,&now.rt,&now.l)!=EOF){ if(q.empty()){ q.push(now); lt=now.at; continue; }else{ while(!q.empty()){//可能间距过大,可以处理一堆 last=q.top(); q.pop(); nt=now.at-lt; if(nt+last.al>=last.rt){//可用时间超过所需时间 cout<<last.num<<" "<<lt-last.al+last.rt<<endl;//那肯定干完了 lt=lt-last.al+last.rt;//下一程序开始时间 }else{ last.al+=nt;//把已完成部分记录 q.push(last);//重新进入队列(毕竟At没改,顺序不变) break; } } lt=now.at; } q.push(now); } while(!q.empty()){//处理剩下的 now=q.top(); q.pop(); cout<<now.num<<" "<<lt+now.rt-now.al<<endl; lt=lt+now.rt-now.al; } return 0; }