UVa 12100 (模拟) Printer Queue

用一个队列模拟,还有一个数组cnt记录9个优先级的任务的数量,每次找到当前最大优先级的任务然后出队,并及时更新cnt数组。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <queue>
 6 using namespace std;
 7 
 8 struct Task
 9 {
10     int pos, pri;
11     Task(int pos = 0, int pri = 0):pos(pos), pri(pri) {}
12 };
13 
14 int cnt[10];
15 
16 int main()
17 {
18     //freopen("in.txt", "r", stdin);
19 
20     int T; scanf("%d", &T);
21     while(T--)
22     {
23         int n, p;
24         scanf("%d%d", &n, &p);
25         memset(cnt, 0, sizeof(cnt));
26         queue<Task> Q;
27         for(int i = 0; i < n; i++)
28         {
29             int pri;
30             scanf("%d", &pri);
31             Q.push(Task(i, pri));
32             cnt[pri]++;
33         }
34         while(1)
35         {
36             Task t = Q.front();
37             int m;
38             for(m = 9; m >= t.pri; m--) if(cnt[m]) break;
39             cnt[m]--;
40             if(m > t.pri)
41             {
42                 while(t.pri != m)
43                 {
44                     Q.pop();
45                     Q.push(t);
46                     t = Q.front();
47                 }
48                 Q.pop();
49                 if(t.pos == p) break;
50                 //printf("sz = %d
", Q.size());
51             }
52             else
53             {
54                 Q.pop();
55                 if(t.pos == p) break;
56             }
57         }
58         printf("%d
", n - Q.size());
59     }
60 
61     return 0;
62 }
代码君
原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4455386.html