uvalive 3135 Argus

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

题意:

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

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

思路:

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

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

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

代码:

 1 #include <string>
 2 #include <iostream>
 3 #include <queue>
 4 using namespace std;
 5 
 6 struct node
 7 {
 8     int num;
 9     int pe;
10     int ti;
11 
12     bool operator < (const node& rhs) const
13     {
14         if (ti == rhs.ti) return num > rhs.num;
15         return ti > rhs.ti;
16     }
17 } a[1005];
18 
19 priority_queue<node> pq;
20 
21 int main()
22 {
23     int cnt = 0;
24 
25     string b;
26 
27     while (cin >> b)
28     {
29         if (b[0] == '#') break;
30 
31         cin >> a[cnt].num >> a[cnt].pe;
32 
33         cnt++;
34     }
35 
36     int k;
37 
38     cin >> k;
39 
40     for (int i = 1;i <= 3000;i++)
41     {
42         for (int j = 0;j < cnt;j++)
43         {
44             if (i % a[j].pe == 0)
45             {
46                 node tmp = (node){a[j].num,a[j].pe,i};
47 
48                 pq.push(tmp);
49             }
50         }
51     }
52 
53     for (int i = 0;i < k;i++)
54     {
55         node tmp = pq.top();pq.pop();
56 
57         cout << tmp.num << endl;
58     }
59 
60     return 0;
61 }

 

posted @ 2017-10-09 22:40  qrfkickit  阅读(238)  评论(0编辑  收藏  举报