https://vjudge.net/problem/UVALive-3135

题意:

有一个系统有多个指令,每个指令产生一个编号为qnum的时间,每个指令的触发间隔不相同,现在给出若干个指令,现在的任务是模拟前k个事件。

如果时间在同一时间发生,那么qnum小的先输出。

思路:

很多相同的数值在同一时刻内,数值小的先输出,那么就是求若干个中最小的,那么就可以用优先队列进行维护。

这里,因为时间范围较小,之后每个事件的时间取余,那么符合的就把一个结构体扔进优先队列,这个结构体包括了qnum,period以及time。

我们重载 < 的时候,发生时间相同的话,把qnum小的优先级调高,时间不同的话,时间在前的优先级高。

代码:

 #include <string>
#include <iostream>
#include <queue>
using namespace std; struct node
{
int num;
int pe;
int ti; bool operator < (const node& rhs) const
{
if (ti == rhs.ti) return num > rhs.num;
return ti > rhs.ti;
}
} a[]; priority_queue<node> pq; int main()
{
int cnt = ; string b; while (cin >> b)
{
if (b[] == '#') break; cin >> a[cnt].num >> a[cnt].pe; cnt++;
} int k; cin >> k; for (int i = ;i <= ;i++)
{
for (int j = ;j < cnt;j++)
{
if (i % a[j].pe == )
{
node tmp = (node){a[j].num,a[j].pe,i}; pq.push(tmp);
}
}
} for (int i = ;i < k;i++)
{
node tmp = pq.top();pq.pop(); cout << tmp.num << endl;
} return ;
}
05-10 23:21