题目大意:输入整数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 }
时间: 2024-09-28 21:00:37