编写一个称为Argus的系统。该系统支持一个Register命令
Register Q_num Period
该命令注册了一个触发器,它每Period秒钟会产生一次编号为Q_num的事件。你的任务是模拟出前K个事件。如果多个事件同时发生,先处理Q_num小的事件。
输入格式:
输入仅包含一组数据。前若干行是Register命令,以”#“结尾;最后一行是整数K。对于每条命令,1 <= Q_num,Period <= 3000。K <= 10000.命令条数n不超过1000。
输出格式:
输出k行,即前k个事件的Q_num。
思路:可是使用优先级队列priority_queue来处理下一个要发生的事件。先将事件按要求存储,然后按要求输出。
代码如下:
#include <cstdio>
#include <queue>
using namespace std;
struct Argus
{
int QNum,Period,Time;//Time用来更新事件发生时间
bool operator<(const Argus & a) const//优先级高出队列
{
return Time > a.Time || (Time == a.Time && QNum > a.QNum);
}
};
int main()
{
priority_queue<Argus> pq;
char s[20];
while (scanf("%s",s) && s[0] != '#')
{
Argus item;
scanf("%d%d",&item.QNum,&item.Period);
item.Time = item.Period;//初始化更新时间
pq.push(item);
}
int K;
scanf("%d",&K);
while (K--)
{
Argus r = pq.top();
pq.pop();
printf("%d\n",r.QNum);
r.Time += r.Period;//更新时间
pq.push(r);//重新插入
}
return 0;
}