题目
有 5 台打印机打印文件,每台打印机有自己的待打印队列。 因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10
不同的优先级,其中数字越大优先级越高。 打印机会从自己的待打印队列中选择优先级最高的文件来打印。 如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。 现在请你来模拟这5
台打印机的打印过程。
输入
每个输入包含 1 个测试用例,每个测试用例第 1 行给出发生事件的数量 N(0<N<1000)
。 接下来有 N 行,分别表示发生的事件。 共有如下两种事件:
IN P NUM
,表示有一个拥有优先级NUM
的文件放到了打印机P
的待打印队列中。(0<P≤5,0<NUM≤10)
;OUT P
,表示打印机P
进行了一次文件打印,同时该文件从待打印队列中取出。(0<P≤5)
。
输出
对于每个测试用例,每次OUT P
事件,请在一行中输出文件的编号。 如果此时没有文件可以打印,请输出NULL
。 文件的编号定义为:IN P NUM
事件发生第 X
次,此处待打印文件的编号为 X
。编号从1
开始。
示例一
输入
7
IN 1 1
IN 1 2
IN 1 3
IN 2 1
OUT 1
OUT 2
OUT 2
输出
3
4
NULL
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
class Task implements Comparable<Task> {
int taskId; // 任务ID
int priority; // 任务优先级
int index; // 任务到达顺序
public Task(int taskId, int priority, int index) {
this.taskId = taskId;
this.priority = priority;
this.index = index;
}
@Override
public int compareTo(Task o) {
if (this.priority != o.priority) { // 如果优先级不同,按照优先级从高到低排序
return o.priority - this.priority;
} else { // 否则按照到达顺序从早到晚排序
return this.index - o.index;
}
}
}
public class OdAb20 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 事件数量
Queue<Task>[] queues = new Queue[6]; // 用数组存储5台打印机的待打印队列
for (int i = 1; i <= 5; i++) {
queues[i] = new PriorityQueue<>(); // 初始化队列为优先队列
}
int count = 0; // 计数器,记录加入队列的文件编号
for (int i = 0; i < n; i++) {
String op = sc.next(); // 读取操作类型
if (op.equals("IN")) { // 如果是加入文件到队列中
int p = sc.nextInt(); // 打印机编号
int num = sc.nextInt(); // 文件优先级
queues[p].add(new Task(++count, num, i)); // 将任务添加到对应打印机的待打印队列中
} else { // 否则是打印文件出队列
int p = sc.nextInt(); // 打印机编号
if (queues[p].isEmpty()) { // 如果队列为空,输出NULL
System.out.println("NULL");
} else { // 否则将队首元素(最高优先级的文件)出队并输出其编号
Task t = queues[p].poll();
System.out.println(t.taskId);
}
}
}
}
}