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