[Luogu P2278] [HNOI2003]操作系统
Posted GoldenPotato的OI世界
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Luogu P2278] [HNOI2003]操作系统相关的知识,希望对你有一定的参考价值。
题面
传送门:https://www.luogu.org/problemnew/show/P2278
Solutiton
挺简单的一道模拟题,拿堆模拟一下题目意思就好
堆中有两个关键字,分别是优先级和到达时间
还要维护一下每个任务剩余时间(还有多久完成)
因为堆不能直接改.得在堆里记录编号然后映射出来
这里总结一下要注意的细节:
1.在下一个任务到达之前,尽可能把CPU内的任务完成了
2.注意读入
3.注意注释文件读写233(我因为这破事爆零一次)
4.没了
好像不需要记录到达时间,编号即为到达时间先后
但懒得改了
Code
//Luogu P2278 [HNOI2003]操作系统 //May,4th,2018 //堆+模拟 #include<iostream> #include<cstdio> #include<queue> using namespace std; const int N=1000000; int t[N]; struct op { int a,no,at; friend bool operator < (op A,op B) { if(A.a==B.a) return A.at > B.at; return A.a < B.a; } }; priority_queue <op,vector<op> > d; int main() { //freopen("system.in","r",stdin); int no,at,T,a,t_now=0; while(scanf("%d%d%d%d",&no,&at,&T,&a)==4) { while(d.empty()==false) { op now=d.top(); if(t[now.no]<=at-t_now) { d.pop(); t_now+=t[now.no]; printf("%d %d\\n",now.no,t_now); } else { t[now.no]-=at-t_now; break; } } op temp; temp.no=no,temp.a=a,temp.at=at,t[no]=T; d.push(temp); t_now=at; } while(d.empty()==false) { op now=d.top(); d.pop(); t_now+=t[now.no]; printf("%d %d\\n",now.no,t_now); } return 0; }
以上是关于[Luogu P2278] [HNOI2003]操作系统的主要内容,如果未能解决你的问题,请参考以下文章