题目链接:http://poj.org/problem?id=2051
题目意思:题目有点难理解,所以结合这幅图来说吧~~~~
有一个叫Argus的系统,该系统支持一个 Register 命令,输入就是类似样例中的:
Register 2004 200
代表编号为 2004 的 Register,每隔 200 个时间单位就会产生一次。2005 同理。然后需要输出前 k 个事件。如果多个事件同时发生,就先输出编号较少的。所以在 600 这个时间上,2004 要比 2005 先输出。
第一次学 rj 哥哥的优先队列,好神奇咯 ^___^
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 struct node 8 { 9 int Q_num, Period; 10 int Time; 11 bool operator < (const node& a) const { 12 return Time > a.Time || (Time == a.Time && Q_num > a.Q_num); // 时间少的先输出或者时间相同时先输出编号小的 13 } 14 }; 15 16 int main() 17 { 18 #ifndef ONLINE_JUDGE // 这段东西原来不能写在LA或者POJ上的!!否则会神奇地出现TLE(G++), MLE(C++)现象 19 freopen("in.txt", "r", stdin); // 用C++(220K 16ms)提交比G++(732K 47ms)快不少 20 #endif // ONLINE_JUDGE 21 22 char s[20]; 23 node tmp; 24 priority_queue<node> pq; 25 while (scanf("%s", s) && s[0] != ‘#‘) { 26 scanf("%d%d", &tmp.Q_num, &tmp.Period); 27 tmp.Time = tmp.Period; // 周期,即每间隔Period的时间该事件会再次发生 28 pq.push(tmp); 29 } 30 31 int K; 32 scanf("%d", &K); 33 while (K--) { 34 tmp = pq.top(); 35 pq.pop(); 36 printf("%d\n", tmp.Q_num); 37 tmp.Time += tmp.Period; // 更新该事件下一次发生的时间 38 pq.push(tmp); // 重新插入优先队列进行优先级比较 39 } 40 return 0; 41 }
原文:http://www.cnblogs.com/windysai/p/4289413.html