【题目描述】:阿格斯 有一种指令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
|
【关键词】:优先队列的使用 |
相关文章
- 10-30UVALive 3135阿格斯