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\n", Q.size());

51             }

52             else

53             {

54                 Q.pop();

55                 if(t.pos == p) break;

56             }

57         }

58         printf("%d\n", n - Q.size());

59     }

60 

61     return 0;

62 }
代码君

 

你可能感兴趣的:(Queue)