UVALive 3135阿格斯

UVALive 3135§

【题目描述】:阿格斯

有一种指令Q  Rgister(编号,周期),指令每个周期震荡一次。

【算法分析】:关键之处:周期不同。这道题用优先队列模拟,而且注意优先队列定义operator<和排序方式相反。

  1 #include<iostream>
  2 
  3 #include<stdio.h>
  4 
  5 #include<string.h>
  6 
  7 #include<algorithm>
  8 
  9 #include<stdlib.h>
 10 
 11 #include<math.h>
 12 
 13 #include<queue>
 14 
 15 #include<vector>
 16 
 17 #include<map>
 18 
 19 #define MAXN 1100+10
 20 
 21 #define MAXM 20000+5
 22 
 23 #define oo 9556531
 24 
 25 #define eps 0.000001
 26 
 27 #define PI acos(-1.0)//这个精确度高一些
 28 
 29 #define REP1(i,n) for(int i=0;i<(n);i++)
 30 
 31 #define REP2(i,n) for(int i=1;i<=(n);i++)
 32 
 33 using namespace std;
 34 
 35  
 36 
 37 struct Argus
 38 
 39 {
 40 
 41     int Q;//编号
 42 
 43     int V;//间隔
 44 
 45      int T;//当前时间
 46 
 47     bool operator <(const Argus& x) const{
 48 
 49         if (T==x.T) return Q>x.Q;else return T>x.T;//优先级高的先出队列,开始写的小于,why/?
 50 
 51     }
 52 
 53 };
 54 
 55 priority_queue<Argus> qu;
 56 
 57 char s[15];
 58 
 59 int main()
 60 
 61 {
 62 
 63     while(cin>>s)
 64 
 65     {
 66 
 67         if (s[0]=='R')
 68 
 69         {
 70 
 71             int NUM,VAL;
 72 
 73             cin>>NUM>>VAL;
 74 
 75             Argus newa=(Argus){NUM,VAL,VAL};//注意第一次开始时间是周期
 76 
 77             qu.push(newa);
 78 
 79         }else//开始读命令
 80 
 81         {
 82 
 83             int k;
 84 
 85             cin>>k;
 86 
 87             while(k--)
 88 
 89             {
 90 
 91                 Argus a=qu.top();
 92 
 93                 cout<<a.Q<<endl;
 94 
 95 //                cout<<a.V<<endl;
 96 
 97                 a.T=a.T+a.V;
 98 
 99                 qu.pop();
100 
101                 qu.push(a);
102 
103             }
104 
105             while(!qu.empty()) qu.pop();//清空
106 
107         }
108 
109     }
110 
111     return 0;
112 
113 }
114 
115  

 

 【关键词】:优先队列的使用
posted @ 2014-01-18 17:13  little_w  阅读(450)  评论(0编辑  收藏  举报