天天看點

UVa12100 列印列隊

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

理好邏輯 一層一層結構搭建下來

繼續閱讀