题目大意:一个成为Argus的系统,支持一个Register命令: Register Q_num Period
该命令为一个祖册出发器,每Period产生一次Q_num的时间。要求模拟k个事件,如果多个事件同时发生,现处理Q_num小的。
解题思路:用优先队列维护即可,队列中按照时间小的优先,时间相同的比较Q_num,每次处理完一个时间,对应的将时间的时间加上period后放回队列中,表示下一次出发器生成的时间。
#include <cstdio> #include <queue> using namespace std; struct Item { int Q_num, Period, Time; bool operator < (const Item& a) const { return a.Time < Time || (a.Time == Time && a.Q_num < Q_num); } }; int main() { char S[30]; int Q_num, Period, K; priority_queue<Item> pq; Item item; while (scanf("%s", S) && S[0] != '#') { scanf("%d%d", &item.Q_num, &item.Period); item.Time = item.Period; pq.push(item); } scanf("%d", &K); while (K--) { item = pq.top(); printf("%d\n", item.Q_num); pq.pop(); item.Time += item.Period; pq.push(item); } return 0; }