[Luogu P2278] [HNOI2003]操作系统
      
      
    
   
  
  
    题面
传送门:洛咕
Solutiton
挺简单的一道模拟题,拿堆模拟一下题目意思就好 堆中有两个关键字,分别是优先级和到达时间 还要维护一下每个任务剩余时间(还有多久完成) 因为堆不能直接改.得在堆里记录编号然后映射出来 这里总结一下要注意的细节: 1.在下一个任务到达之前,尽可能把CPU内的任务完成了 2.注意读入 3.注意注释文件读写233(我因为这破事爆零一次) 4.没了 好像不需要记录到达时间,编号即为到达时间先后 但懒得改了
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
   | 
 
  #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() {          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; }
 
 
  |