題意:有一個列印機,有一些任務在排着隊列印,每個任務都有優先級。列印時,每次取出隊列第一個任務,如果它的優先級不是目前隊列中最高的,就會被放到隊尾,否則就列印出來。輸出初始隊列的第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;
}
理好邏輯 一層一層結構搭建下來