参看:https://blog.csdn.net/u013480600/article/details/24245021
题目大意:
给定多个命令,每个命令如Register 2004 200 对应于编号为2004的事件,每隔200秒发生一次(首次发生是在200秒);然后在给你一个K,要你输出前K个发生事件的编号. 如果几个事件同时发生,输出事件编号小的.
思路分析:
刘汝佳训练指南P188例题.
每次从队列中取出时间最小且编号最小,即数组有固定的排序规则,且永远输出规则下最小的哪一个,即为优先队列的应用;
【需要注意的是这是一个周期性出现的,即它的下一次出现时间比前一次多一倍】
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
using namespace std;
struct Node{
int id;
int time;
int period;
Node(int id,int time,int period):id(id),time(time),period(period){};
bool operator <(const Node &rhs)const{
return time>rhs.time||(time==rhs.time&&id>rhs.id);
}
};
int main(){
string com;//Resiger
priority_queue<Node> Q;
while(cin>>com){
if(com=="#")break;
int id,time;
cin>>id>>time;
Q.push(Node(id,time,time));
}
int k;
scanf("%d",&k);
while(k--){
Node tmp=Q.top();Q.pop();
cout<<tmp.id<<endl;
tmp.time+=tmp.period;
Q.push(tmp);
}
return 0;
}