UVA - 1203 Argus

题目大意:一个成为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;
}


你可能感兴趣的:(UVA - 1203 Argus)