题意:你的任务是编写一个称为argus的系统。该系统支持一个register命令 Register Q_num Period
该命令注册了一个触发器,它每个Period秒钟就会产生一次编号为Q_num的事件。你的任务是模拟出前K个事件。如果多个事件同时发生,先处理Q_num小的事件。
分析:
用优先队列来维护每个触发器的“下一个事件“,然后每次从中取出最早发生的一个事件,重复K次即可。
// File Name: 1203.cpp // Author: zlbing // Created Time: 2013/3/6 18:18:19 #include<iostream> #include<string> #include<algorithm> #include<cstdlib> #include<cstdio> #include<set> #include<map> #include<vector> #include<cstring> #include<stack> #include<cmath> #include<queue> using namespace std; #define CL(x,v); memset(x,v,sizeof(x)); #define INF 0x3f3f3f3f #define LL long long #define REP(i,n) for(int i=0;i<n;i++) #define REP1(i,n) for(int i=1;i<n+1;i++) struct Item{ int Q_num,Period,Time; bool operator <(const Item& T)const{ if(Time==T.Time) return Q_num>T.Q_num; else return Time>T.Time; } }; int main(){ priority_queue<Item> Q; char str[10]; while(~scanf("%s",str)) { if(str[0]=='#')break; int a,b; scanf("%d%d",&a,&b); Q.push((Item){a,b,b}); } int N; scanf("%d",&N); while(N--) { Item t=Q.top(); Q.pop(); printf("%d\n",t.Q_num); t.Time+=t.Period; Q.push(t); } return 0; }