洛谷P2278 [HNOI2003]操作系统
主要思路:模拟,优先队列
考虑维护一个优先队列,重载小于号,对于这个小于号的定义为如果两个工作等级相同,那么按照到达时间先后排序,否则按照工作等级高低排序
然后每输入一个工作,考虑在这个工作执行之前所有可以被完成的工作,当已经不存在可以被完成的工作但队列非空的时候,表示目前的工作只能被完成一部分,那么处理这个部分并更新当前时间和这个工作完成需要的时间
对于在输入结束后还没有被完成的工作,其已经在优先队列中按照顺序排序,只需要从队头开始完成并输出即可
注意点:
1.优先队列中定义的是小于号,相关大小比较需要相反
2.scanf在成功输入时的返回值是输入个数,失败时返回值是-1;
#include<iostream> #include<cstdio> #include<queue> using namespace std; struct node{ int id,rea,nee,lev; bool operator <(const node &rhs) const{ return lev==rhs.lev?rea>rhs.rea:lev<rhs.lev; } }; node pre; int a,b,c,d,tnow=0; priority_queue<node>q; int main(){ while(scanf("%d %d %d %d",&a,&b,&c,&d)!=EOF){ pre.id=a; pre.rea=b; pre.nee=c;pre.lev=d; while(!q.empty()&&tnow+q.top().nee<=pre.rea){ node fr=q.top(); q.pop(); printf("%d %d\n",fr.id,fr.nee+tnow); tnow+=fr.nee; } if(!q.empty()){ node fr=q.top(); q.pop(); fr.nee=fr.nee-pre.rea+tnow; q.push(fr); } q.push(pre); tnow=pre.rea; } while(!q.empty()){ node fr=q.top(); q.pop(); tnow+=fr.nee; printf("%d %d\n",fr.id,tnow); } return 0; }