1. 程式人生 > >uva 12100 Printer Queue(列印佇列)模擬

uva 12100 Printer Queue(列印佇列)模擬

思路:按照輸入的順序,將每個任務入隊,同時用另一個數組儲存這些優先順序,然後按照從大到小或者從小到大的順序對陣列排序,表示每個執行的先後順序。然後對佇列進行操作,先從佇列頭取出一個元素,判斷是不是和陣列的下標指向的值相等,若相等,則列印的時間數+1,同時陣列下標+1或者-1,若不相等,則直接扔到隊尾,重新開始下一次迴圈。

(開始理解錯題意,認為是把佇列中優先順序最高的任務直接移除,而忽略了佇列只能一個一個的出)

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int t = scan.nextInt();
		while(t--!=0){
			int n = scan.nextInt();
			int m = scan.nextInt();
			Queue<Num> q = new LinkedList<>();
			int[] A = new int[n];
			for(int i=0;i<n;i++){
				int p = scan.nextInt();
				Num num = new Num(p,i);
				q.add(num);
				A[i] = p;
			}
			Arrays.sort(A);
			int j = n-1;
			int cnt = 0;
			boolean ok = false;
			while(!ok){
				Num num = q.peek();
				q.poll();
				if(num.value==A[j]){
					cnt++;
					j--;
					if(num.pos==m){
						ok = true;
					}
				}else{
					q.add(num);
				}
				
			}
			System.out.println(cnt);
		}
	}
	
	static class Num{
		int value;
		int pos;
		public Num(int value,int pos){
			this.value = value;
			this.pos = pos;
		}
	}
}