华为OD2023(A卷)基础题20【打印文件】

该文章描述了一个Java程序,用于模拟5台打印机处理具有优先级的文件打印任务。程序使用PriorityQueue数据结构来管理打印机的待打印队列,按照优先级和文件到达顺序进行排序。当打印机执行打印操作时,会取出优先级最高的文件。如果队列为空,则输出NULL。
摘要由CSDN通过智能技术生成

题目

有 5 台打印机打印文件,每台打印机有自己的待打印队列。 因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的优先级,其中数字越大优先级越高。 打印机会从自己的待打印队列中选择优先级最高的文件来打印。 如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。 现在请你来模拟这5台打印机的打印过程。

输入

每个输入包含 1 个测试用例,每个测试用例第 1 行给出发生事件的数量 N(0<N<1000)。 接下来有 N 行,分别表示发生的事件。 共有如下两种事件:

  1. IN P NUM,表示有一个拥有优先级 NUM 的文件放到了打印机 P 的待打印队列中。(0<P≤5,0<NUM≤10)
  2. 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);
                }
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值