用一个队列模拟,还有一个数组cnt记录9个优先级的任务的数量,每次找到当前最大优先级的任务然后出队,并及时更新cnt数组。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }