題目描述
輸入格式
輸出格式
題意翻譯
學生會里只有一臺打印機,但是有很多文件需要打印,因此打印任務不可避免地需要等待。有些打印任務比較急,有些不那麼急,所以每個任務都有一個1~9間的優先級,優先級越高表示任務越急。
打印機的運作方式如下:首先從打印隊列裏取出一個任務J,如果隊列裏有比J更急的任務,則直接把J放到打印隊列尾部,否則打印任務J(此時不會把它放回打印隊列)。 輸入打印隊列中各個任務的優先級以及所關注的任務在隊列中的位置(隊首位置爲0),輸出該任務完成的時刻。所有任務都需要1分鐘打印。例如,打印隊列爲{1,1,9,1,1,1},目前處於隊首的任務最終完成時刻爲5。
輸入T 接下來T組數據 每組數據輸入N,TOP。接下來N個數,TOP代表隊列首
Translated by @HuangBo
思路:
第一步、
此題的重心是在判斷任務的優先級,而任務本身可以忽略,因爲在初始化的爲任務設置優先級的時候,任務的編號默認從0、1、2、3...,因此通過編號作爲數組下標創建數組,保留其任務的優先級。
第二步、
爲其創建第二個數組保存排序後的優先級。
第三步、
模擬打印,打印當前任務時,在以自己編號作爲下標的數組中,得到優先級判斷是否大於或等於最高優先級且是否是我關注的打印任務,意思就是有3種情況,低於最高優先級、高於或等於最高優先級且不是我關注的、高於或等於最高優先級是我關注的。
輸入輸出樣例
輸入 #1複製
3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1
輸出 #1複製
1
2
5
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
//數據條數
cin>>T;
for(int i=0;i<T;i++){
int n;//打印任務數量
int m; //我的任務編號
int x; //優先級
cin>>n>>m;
//q存儲的是a數組的下標
queue<int> q;
//a存儲優先級,b優先級排序
vector<int> a,b;
for(int j=0;j<n;j++){
//各項任務的優先級
cin>>x;
a.push_back(x);
b.push_back(x);
q.push(j);
}
//對b排序
sort(b.begin(),b.end(),greater<int>()); //降序(默認升序)
//思路判斷a存儲的優先級,是否爲最高優先級,如果是則讓q出隊。
int w=0;//指向當前隊列最高優先級的下標
int max=0;//讀取隊列最高優先級
int time=0;//完成個數
while(!q.empty()){
max=b[w];
int t=q.front();
if(a[t]<max){
q.pop();
q.push(t);
} else{
if(t==m){
cout<<++time<<endl;
break;
}else{
q.pop();
time++;
w++;
}
}
}
}
}