如何在华为OD机试中获得满分?Java实现【打印文件】一文详解!

news/2024/10/20 5:46:21/

请添加图片描述

✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)

文章目录

  • 1. 题目描述
    • 2. 输入描述
    • 3. 输出描述
    • 4. Java算法源码
    • 5. 测试
    • 6.解题思路

1. 题目描述

有 5 台打印机打印文件,每台打印机有自己的待打印队列。

因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的优先级,其中数字越大优先级越高。

打印机会从自己的待打印队列中选择优先级最高的文件来打印。

如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。

现在请你来模拟这5台打印机的打印过程。

2. 输入描述

每个输入包含 1 个测试用例,每个测试用例第 1 行给出发生事件的数量N(0<N<1000)。

接下来有 N 行,分别表示发生的事件。

共有如下两种事件:

IN P NUM,表示有一个拥有优先级 NUM 的文件放到了打印机 P 的待打印队列中。(0<P≤5,0<NUM≤10);
OUT P,表示打印机 P 进行了一次文件打印,同时该文件从待打印队列中取出。(0<P≤5)。

3. 输出描述

对于每个测试用例,每次OUT P事件,请在一行中输出文件的编号。

如果此时没有文件可以打印,请输出NULL。

文件的编号定义为:IN P NUM事件发生第 X 次,此处待打印文件的编号为 X。编号从1开始。

4. Java算法源码

public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();sc.nextLine();// 放置打印任务 key:打印机的编号,value:type集合Map<String, List<int[]>> map = new HashMap<>();int count = 0;for (int i = 0; i < n; i++) {String[] strs = sc.nextLine().split(" ");// 存入mapif (strs[0].equals("IN")) {int[] inInts = new int[2];inInts[0] = Integer.parseInt(strs[2]);inInts[1] = ++count;List<int[]> inList = new ArrayList<>();if (map.containsKey(strs[1])) {inList = map.get(strs[1]);inList.add(inInts);} else {inList.add(inInts);}map.put(strs[1], inList);// 判断打印机是否存在打印任务} else if (strs[0].equals("OUT")) {if (!map.containsKey(strs[1])) {System.out.println("NULL");continue;}// 如果存在,求出打印机的打印任务List<int[]> outList = map.get(strs[1]);// 如果不存在打印任务,输出NULLif (outList.size() == 0) {System.out.println("NULL");} else {outList.sort((a, b) -> {return b[0] - a[0];});System.out.println(outList.get(0)[1]);// 取出第一个元素outList.remove(0);}}}
}

5. 测试

在这里插入图片描述

6.解题思路

在这里插入图片描述

  1. 读取输入的测试用例数量N。
  2. 创建一个HashMap,用于存储每个打印机的待打印队列。键是打印机的编号,值是一个包含文件信息的列表。列表中的每个元素是一个整型数组,包含两个元素:文件的优先级和文件的编号。
  3. 使用一个计数器count,用于记录文件的编号。
  4. 循环N次,处理每个事件:
    • 读取一行输入,将其分割为事件类型和相关参数。
    • 如果事件类型是"IN",表示有一个文件放入了待打印队列。将文件的优先级和编号存储到列表中,并将列表存储到HashMap中对应打印机的键值对中。
    • 如果事件类型是"OUT",表示打印机进行了一次文件打印。首先检查待打印队列是否为空,如果为空则输出"NULL"。否则,获取待打印队列中优先级最高的文件(优先级最大且编号最小)。输出该文件的编号,并从待打印队列中移除该文件。
  5. 完成所有事件处理后,结束程序。

该算法的时间复杂度为O(NlogM),其中N是事件数量,M是待打印队列中文件的平均数量。每次处理OUT事件时,需要对待打印队列中的文件按优先级进行排序,时间复杂度为O(MlogM)。最终的空间复杂度取决于待打印队列中文件的总数量,即O(M)
在这里插入图片描述


http://www.ppmy.cn/news/87941.html

相关文章

【day 09】vue的过渡与动画

Vue 的过渡与动画 基础的过渡 案例 <!-- 第一步 包一个transition标签 --><transition><Song id"song" v-if"bool"></Song></transition>/* 希望组件节点 离开的时候 有过渡效果离开的起点 离开的终点*/.v-leave{/* 离开…

Maven概念及搭建

1.为什么我们要学习 maven? maven 还未出世的时候&#xff0c;我们有很多痛苦的经历 。 痛点 1&#xff1a; jar 包难以寻找 痛点 2&#xff1a; jar 包依赖的问题 痛点 3&#xff1a; jar 不方便管理 痛点 4&#xff1a;项目编译 2.Maven 简介 Maven 是 Apache 软件基金…

SpringBoot统一功能处理的三个常见实例

我们的统一功能处理肯定是通过Spring拦截器处理的撒 Spring拦截器 截器的实现分为以下两个步骤&#xff1a; 1. 创建⾃定义拦截器&#xff0c;实现 HandlerInterceptor 接⼝的 preHandle&#xff08;执⾏具体⽅法之前的预处理&#xff09;⽅ 法。 2. 将⾃定义拦截器加⼊ W…

[算法前沿]--017-中文大模型ChatGLM微调:P-Tuning,deepspeed,LoRA<中>

文章目录 1. ChatGLM模型介绍2. 基于 P-Tuningv2的高效参数微调方法2.1 环境配置2.3 P-TuningV2 教程2.3.1 训练2.3.1.1 P-Tuning v22.3.1.2 Finetune2.3.1.3 LoRA2.3.2 推理2.3.2.1 示例12.3.2.2 示例22.3.3 评估结果1. ChatGLM模型介绍 ChatGLM-6B 是一个开源的、支持中英双语…

【历史上的今天】5 月 26 日:美国首个计算机软件程序专利;苹果市值首次超越微软;Wiki 的发明者出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 5 月 26 日&#xff0c;在 1995 年的今天&#xff0c;微软公司首席执行官比尔盖茨发表了一番讲话&#xff0c;他认为自己的公司在估计互联网的影响和普及方面错…

windows 环境jar包设置自启动

在Windows操作系统中&#xff0c;可以通过创建一个批处理文件并将其添加到Windows服务中来设置Spring Boot JAR包的开机自启动。具体步骤如下&#xff1a; 创建一个名为spring-boot-app.bat的批处理文件&#xff0c;并在其中指定启动Spring Boot应用程序的命令&#xff0c;如下…

【C++进阶之路】内存管理

文章目录 一.内存管理1. 内存布局2. C的内存管理 ①内置类型② 自定义类型 3. operate new 与 operate delete ① 解读operate new源代码② 解读operate delete源代码 4. new和delete的基本原理①new对类对象②delete对类对象 拓展—— 深入理解delete[]和new[]对比 C和C内存…

Mysql数据库备份 一天一次 保存最新五天 每天凌晨三点备份

Mysql数据库备份 一天一次 保存最新五天 每天凌晨一点三十备份 步骤一 先查看 sudo systemctl status crond 是否存在 不存在执行下面代码 sudo yum install cronie sudo systemctl start crond sudo systemctl enable crond sudo systemctl status crond 步骤二 Cd /home …