洛谷-UVA12100 打印隊列 Printer Queue

題目描述

PDF

輸入格式

輸出格式

題意翻譯

學生會里只有一臺打印機,但是有很多文件需要打印,因此打印任務不可避免地需要等待。有些打印任務比較急,有些不那麼急,所以每個任務都有一個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++;
				}
			}
		} 
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章