题意:你的任务是编号一个称为Argus的系统。该系统支持Register命令
该命令注册了一个触发器,它每Period秒钟就会产生一次编号为Q_num的事件。你的任务是模拟出前k个事件,如果多个事件同时发生,先处理Q_num 小的事件。
【输入格式】
输入仅包含组数据。前若干行是Register 命令,以“#”结尾: 最后一行是整数k。对于每条命令,1≤Q mm,Periods≤3000。kx ≤10000。命令条数n不超过1000。
【输出格式】
输出k行,即前k个事件的Q_num
【分析】
用优先队列来维护每个触发器的“下一个事件”,然后每次从中取出最早发生的一个时间,重复k次即可。总复杂度k*logN
思路:优先队列模拟,时间早的优先,相等按Q_num小的。
#include<bits/stdc++.h> using namespace std; struct Item { int QNum, Period, time; bool operator < (const Item& that) const { if (that.time != time) return that.time < time; return that.QNum < QNum; } }; char s[10]; int main() { Item t; priority_queue<Item> PQ; while (~scanf("%s", s) && s[0] != '#') { scanf("%d%d", &t.QNum, &t.Period); t.time = t.Period; PQ.push(t); } int k; scanf("%d", &k); while (k--) { t = PQ.top(); PQ.pop(); t.time = t.time + t.Period; printf("%d\n", t.QNum); PQ.push(t); } return 0; } /* Register 2004 200 Register 2005 300 # 5 */