UVA 1203 Argus(优先队列)
题意:
给你多个命令,每个命令如Register 2004 200 对应于编号为2004的事件,每隔200秒发生一次(首次发生是在200秒).然后在给你一个K,要你输出前K个发生事件的编号.如果几个事件同时发生,输出事件编号小的.
分析:
刘汝佳训练指南P188例题.
本题只需要维护一个优先队列即可,每次从队列中取出时间最小且编号最小的事件,输出其编号,然后将其发生时间加上一个周期再从新放入优先队列即可.
AC代码(新):
#include<queue> #include<cstdio> #include<string> #include<iostream> 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;//Register 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; }
AC代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; struct node { int num; int time; int period; bool operator<(const node&b)const { return time>b.time ||(time==b.time&&num>b.num); } }; int main() { priority_queue<node> pq; char s[1000]; int k; while(scanf("%s",s)==1&&s[0]!='#') { node r; scanf("%d%d",&r.num,&r.period); r.time=r.period; pq.push(r); } scanf("%d",&k); while(k--) { node r=pq.top();pq.pop(); printf("%d\n",r.num); r.time+=r.period; pq.push(r); } return 0; }