news 2026/4/23 12:52:08

(100分)- 打印机队列(Java JS Python)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(100分)- 打印机队列(Java JS Python)

(100分)- 打印机队列(Java & JS & Python)

题目描述

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

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

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

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

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

输入描述

每个输入包含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
说明
输入5
IN 1 1
IN 1 3
IN 1 1
IN 1 3
OUT 1
输出2
说明
题目解析

本题可以基于优先队列实现打印机总是打印优先级最高的文件。

优先队列的实现方式中,有序数组是一种简单方案,但由于需要维护整体有序性,每次插入新任务的时间复杂度为O(n)。

更高效的实现方式是采用堆结构。堆是一种完全二叉树,特别适合优先队列的场景。针对本题需求(数值越大优先级越高),建议使用大顶堆来实现。

JavaScript算法源码

基于有序数组实现优先队列

/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines = []; let n; rl.on("line", (line) => { lines.push(line); if (lines.length === 1) { n = parseInt(lines[0]); } if (n && lines.length === n + 1) { lines.shift(); const tasks = lines.map((line) => line.split(" ")); getResult(tasks); lines.length = 0; } }); function getResult(tasks) { const print = {}; let taskId = 1; for (let i = 0; i < tasks.length; i++) { const [type, printId, priority] = tasks[i]; if (type === "IN") { const arr = [taskId, priority, i]; // i 是先来后到的顺序 if (!print[printId]) { print[printId] = []; // 基于数组实现优先队列 } print[printId].push(arr); print[printId].sort((a, b) => (a[1] != b[1] ? b[1] - a[1] : a[2] - b[2])); // 维持高优先级在头部,如果优先级相同,则按先来后到 taskId++; } else { if (!print[printId] || print[printId].length == 0) { console.log("NULL"); } else { const arr = print[printId].shift(); console.log(arr ? arr[0] : "NULL"); } } } }
Java算法源码

Java已经有优先队列实现类PriorityQueue,因此可以直接使用它。

import java.util.HashMap; import java.util.PriorityQueue; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = Integer.parseInt(sc.nextLine()); String[][] tasks = new String[n][]; for (int i = 0; i < n; i++) { String[] s = sc.nextLine().split(" "); tasks[i] = s; } getResult(tasks); } public static void getResult(String[][] tasks) { // print中存放每台打印机的等待队列 HashMap<String, PriorityQueue<int[]>> print = new HashMap<>(); // 文件的编号定义为”IN P NUM”事件发生第 x 次,此处待打印文件的编号为x。编号从1开始。 int x = 1; for (int i = 0; i < tasks.length; i++) { String[] task = tasks[i]; // IN,OUT都有type和printId String type = task[0]; String printId = task[1]; if ("IN".equals(type)) { // IN还有priority String priority = task[2]; // arr是打印任务 int[] arr = {x, Integer.parseInt(priority), i}; // i代表先来后到的顺序 // 为打印机printId设置打印优先级,打印任务的priority越大,优先级越高 print.putIfAbsent( printId, new PriorityQueue<>( (a, b) -> a[1] != b[1] ? b[1] - a[1] : a[2] - b[2])); // 优先按priority,如果priority相同,按先来后到i // 将打印任务加入对应打印机 print.get(printId).offer(arr); x++; } else { // 打印机等待队列中取出优先级最高的打印任务arr if (!print.containsKey(printId) || print.get(printId).isEmpty()) { // 如果此时没有文件可以打印,请输出”NULL“。 System.out.println("NULL"); } else { int[] arr = print.get(printId).poll(); if (arr != null) System.out.println(arr[0]); // arr[0]是x else System.out.println("NULL"); } } } } }
Python算法源码
import queue # 输入获取 n = int(input()) tasks = [] for i in range(n): tasks.append(input().split()) class Task: def __init__(self, taskId, priority, index): """ :param taskId: 任务ID :param priority: 任务优先级 :param index: 任务到达顺序 """ self.taskId = taskId self.priority = priority self.index = index def __lt__(self, other): if self.priority != other.priority: return self.priority > other.priority else: return self.index < other.index # 算法入口 def getResult(tasks): printer = {} taskId = 1 for i in range(len(tasks)): task = tasks[i] type = task[0] printerId = task[1] if type == "IN": priority = task[2] if printer.get(printerId) is None: printer[printerId] = queue.PriorityQueue() printer[printerId].put(Task(taskId, int(priority), i)) taskId += 1 else: if printer.get(printerId) is None or printer[printerId].qsize() == 0: print("NULL") else: t = printer[printerId].get() print(t.taskId) getResult(tasks)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 9:58:13

《边缘受限设备API客户端轻量化与功能适配实战指南》

不同IoT终端的资源禀赋与业务诉求存在天壤之别,环境感知类终端仅需完成基础数据上报的核心交互,工业现场传感终端则需兼顾指令接收与状态回传,楼宇监测终端还需适配间歇性的断网续传需求,这就决定轻量化设计绝不能采用一刀切的模式,必须基于终端硬件参数台账与业务场景图谱…

作者头像 李华
网站建设 2026/4/23 9:58:34

基于SpringBoot和Vue的实验室预约系统设计与实现

文章目录 详细视频演示项目介绍技术介绍功能介绍核心代码系统效果图源码获取 详细视频演示 文章底部名片&#xff0c;获取项目的完整演示视频&#xff0c;免费解答技术疑问 项目介绍 基于Spring Boot的实验室预约系统采用前后端分离架构&#xff0c;后端以Spring Boot为核心框…

作者头像 李华
网站建设 2026/4/23 11:18:39

从企业能耗集采到区域碳管理-智慧能源平台开发指南

先上干货&#xff01; 墙内仓库地址&#xff08;码云&#xff09;&#xff1a;https://gitee.com/guangdong122/energy-management 已同步更新到 github 仓库 温馨提示&#xff1a;文末有资源获取方式~ 能源系统|能源系统源码|企业能源系统|企业能源系统源码|能源监测系统 一…

作者头像 李华
网站建设 2026/4/23 12:12:19

机器学习面试问题及答案

摘要&#xff1a;本文整理了50个机器学习面试问题及答案&#xff0c;涵盖基础概念到高级应用。基础部分包括机器学习定义、监督/无监督学习、过拟合/欠拟合及解决方法、正则化、特征工程等核心概念。中级部分涉及线性回归、逻辑回归、决策树、随机森林等常用算法原理。高级部分…

作者头像 李华
网站建设 2026/4/23 12:14:25

二维钻孔封孔效果模拟案例解析

二维钻孔封孔效果模拟案例 钻孔封孔这事儿听着简单&#xff0c;实际在地下工程里可是个技术活。今天咱们拿MATLAB的PDE工具箱做个二维模拟&#xff0c;看看封孔材料怎么影响密封效果。先别急着关页面&#xff0c;代码部分我尽量说得像唠嗑&#xff0c;保证不催眠。 先整点基础…

作者头像 李华