思路:按照输入的顺序,将每个任务入队,同时用另一个数组保存这些优先级,然后按照从大到小或者从小到大的顺序对数组排序,表示每个执行的先后顺序。然后对队列进行操作,先从队列头取出一个元素,判断是不是和数组的下标指向的值相等,若相等,则打印的时间数+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; } }}
新闻热点
疑难解答