题意:有一个打印机,有一些任务在排着队打印,每个任务都有优先级。打印时,每次取出队列第一个任务,如果它的优先级不是当前队列中最高的,就会被放到队尾,否则就打印出来。输出初始队列的第m个任务的打印时间,每次打印花费单位1的时间。
Sample Input
3 //有3组样例
1 0
5
4 2 //有4个作业 在查找下表为2这个作业打印完的时间
1 2 3 4 //排序着的作业的优先级
6 0
1 1 9 1 1 1
Sample Output
1
2
5
| 2341 | cnt=1 | m=2
| 3412 | cnt=2 | m=2
| 4123 | cnt=0 | m=3
| 123 | cnt=1 | m=3
| 231 |cnt=2 | m=3
| 321 | cnt =3 | m=3
4 - 3 + 1 = 2
完整代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int t,m,n;
cin >> t;
while(t--){
cin >> n>> m;
priority_queue<int>pq; //默认从大到小排序
queue<int>q;
int a;
for(int i=0;i<n;i++){
cin>>a;
pq.push(a);
q.push(a);
}
int cnt=0; //cnt是为了找到 输入时m对应的作业
while(1){
if(q.front()==pq.top()){
if(cnt==m){
cout<< n - q.size()+1<<endl; // 在打印输输入时m对应的作业前花费了n - q.size() 时间 ,n - q.size()+1就是打印指定作业的时间
break;
}
else{
pq.pop();
q.pop();
cnt++;
}
}
else{
int b = q.front();
q.pop();
q.push(b);
if(cnt==m){
cnt=0;
m=q.size() - 1; //前面还有m的元素才轮到要输入时m对应的作业 ===== 输入时m对应的作业在 下标为 m 这个位置
}
else{
cnt++;
}
}
}
}
return 0;
}
理好逻辑 一层一层结构搭建下来