首页 > 其他 > 详细

poj 2051.Argus 解题报告

时间:2015-02-13 01:24:39      阅读:293      评论:0      收藏:0      [点我收藏+]

题目链接: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 }

 

     

poj 2051.Argus 解题报告

原文:http://www.cnblogs.com/windysai/p/4289413.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!