SOJ 1443. Printer Queue

题目大意:输入整数t,代表测试样例的数量。每个测试样例首先输入整数n和整数m,分别代表队列中作业的数目和目标作业当前位置。然后下一行输入n个大小为1-9的整数,分别代表n个作业的优先级。每次检查队列头部,若队列头部作业的优先级是队列中的最大值,则抛出作业;否则将该作业放入队尾重新排队。要求输出目标作业是第几次被抛出的。

解题思路:构建结构体,包含作业的id(用作业开始的位置作为id)和作业的优先级。模拟抛出作业的过程。利用优先队列保存队列的优先级,能够更高效的判断队列优先级的最大值。

代码如下:

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 
 5 struct Elem {
 6     int pos;
 7     int priority;
 8     Elem(int pos_ = 0, int priority_ = 1) {
 9         pos = pos_;
10         priority = priority_;
11     }
12 };
13 
14 int main() {
15     int t;
16     cin >> t;
17     while (t--) {
18         int n, m;
19         int temp;
20         queue<Elem> elems;
21         priority_queue<int> pq;
22         cin >> n >> m;
23         for (int i = 0; i < n; i++) {
24             cin >> temp;
25             elems.push(Elem(i, temp));
26             pq.push(temp);
27         }
28 
29         int step = 0;
30         while (true) {
31             step++;
32             int next_priority = pq.top();
33             pq.pop();
34             // cout << next_priority << endl;
35 
36             while (elems.front().priority != next_priority) {
37                 elems.push(elems.front());
38                 elems.pop();
39             }
40 
41             if (elems.front().pos == m) {
42                 break;
43             } else {
44                 elems.pop();
45             }
46         }
47 
48         cout << step << endl;
49 
50     }
51 
52     return 0;
53 }

 

posted @ 2015-10-11 20:20  MchCyLh  阅读(272)  评论(0编辑  收藏  举报