华为机试 - 打印机队列
admin
2024-02-26 19:26:06
0

目录

题目描述

输入描述

输出描述

用例

题目解析

算法源码


题目描述

有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
说明

题目解析

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

优先队列,如果想简单一点的话,则可以基于有序数组实现,但是有序数组是整体有序,每次有新任务入队,都需要O(n)时间复杂度维持。

优先队列最好是基于堆结构实现,所谓堆结构,即一颗完全二叉树。本题是优先级数值越大,优先级越高,因此我们可以使用大顶堆。

关于基于堆结构实现优先队列,可以参考

LeetCode - 1705 吃苹果的最大数目_伏城之外的博客-CSDN博客

算法源码

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

/* 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 matrix = lines.map((line) => line.split(" "));getResult(matrix);lines.length = 0;}
});function getResult(matrix) {const print = {};let taskId = 1;matrix.forEach((task) => {const [type, printId, priority] = task;if (type === "IN") {const arr = [taskId, priority];if (!print[printId]) {print[printId] = []; // 基于数组实现优先队列}print[printId].push(arr);print[printId].sort((a, b) => b[1] - a[1]); // 维持高优先级在头部taskId++;} else {const arr = print[printId].shift();console.log(arr ? arr[0] : "NULL");}});
}

基于堆结构实现优先队列

/* 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 matrix = lines.map((line) => line.split(" "));getResult(matrix);lines.length = 0;}
});function getResult(matrix) {const print = {};let taskId = 1;matrix.forEach((task) => {const [type, printId, priority] = task;if (type === "IN") {const arr = [taskId, priority];if (!print[printId]) {print[printId] = new PriorityQueue((a, b) => a[1] - b[1]);// 基于大顶堆实现优先队列}print[printId].push(arr);taskId++;} else {const arr = print[printId].shift();console.log(arr ? arr[0] : "NULL");}});
}class PriorityQueue {constructor(cpr) {this.queue = [];this.cpr = cpr;}swap(a, b) {const tmp = this.queue[a];this.queue[a] = this.queue[b];this.queue[b] = tmp;}// 上浮swim() {let c = this.queue.length - 1;while (c >= 1) {const f = Math.floor((c - 1) / 2);if (this.cpr(this.queue[c], this.queue[f]) > 0) {this.swap(c, f);c = f;} else {break;}}}// 入队push(val) {this.queue.push(val);this.swim();}// 下沉sink() {let f = 0;while (true) {let c1 = 2 * f + 1;let c2 = c1 + 1;let c;let val1 = this.queue[c1];let val2 = this.queue[c2];if (val1 && val2) {c = this.cpr(val1, val2) > 0 ? c1 : c2;} else if (val1 && !val2) {c = c1;} else if (!val1 && val2) {c = c2;} else {break;}if (this.cpr(this.queue[c], this.queue[f]) > 0) {this.swap(c, f);f = c;} else {break;}}}// 出队shift() {this.swap(0, this.queue.length - 1);const res = this.queue.pop();this.sink();return res;}
}

相关内容

热门资讯

60%游客是“渝籍” 重庆人为... 华蓥山康养集群中的原舍·嘿矿熊猫民宿 摄/刘秦君 7月21日,2025年广安马拉松报名通...
如何看待杨超越参加《奇葩说第六... 如何看待杨超越参加《奇葩说第六季》的录制?杨超越虽然唱跳有些不足,但是综艺感还是挺强的。挺好的,她也...
和家人去重庆旅游三天花多少钱?... 重庆,这座充满魅力的城市,以其独特的山城风貌、丰富的历史文化和诱人的美食闻名于世。一直以来,我们都对...
关于狗的动画片 关于狗的动画片 是我最喜欢看《史酷比》(Scooby Doo)系列动画片吧。 过去,我经常在卡...
爆笑成语 爆笑成语爆笑成语幽默的成语大全(389条)幽默成语389个1 最怪的人——虎背熊腰2 最高的巨人——...
好看的网游小说 完本 好看的网游小说 完本不要英雄无敌式的不要YY 最好技术流的《幻世之刺客传说》,很好看的,但现在又停更...
周杰伦有什么有钢琴伴奏的歌? 周杰伦有什么有钢琴伴奏的歌?最好有个谱几乎都有,你可以去虫虫网查一下。很多,比如安静,借口,搁浅等等...
哪位懂八字的给看看哦!我的婚姻... 哪位懂八字的给看看哦!我的婚姻还有希望吗?此命凶,三会木克身,丁火生身无力,整个命局克泄并临,唯有丁...
运动会见闻 运动会见闻    深深的呼吸,等待你的是艰难的1500米。相信胜利会属于你——小明。但在这征途上,需...
有点烦烦烦 有点烦烦烦一个人只有在身心承受能力已经达到零界点的时候才会出现精神分裂,这也是她最后一次自我保护意识...
水果拼盘 水果拼盘1,将各种水果洗净,控干水分,银耳温水泡发,洗净杂质备用 2,将伊丽莎白瓜用V型刀对半切开 ...
在远古神话中追太阳的是谁 在远古神话中追太阳的是谁 夸父远古时候,在北方荒野中有一座高耸入云的高山,在山林深处,生活着一群力...
我一亲戚家的孩子好讨厌 我一亲戚家的孩子好讨厌以前他很小的时候就很调皮,(男孩子),我跟爸妈去他家我和他玩他就喜欢打人或者拿...
作者描写庐山瀑布时,先写它的声... 作者描写庐山瀑布时,先写它的声音(?)在写出作者游庐山瀑布时,先写它的声音《响彻天空》,再写它的《形...
山海经中什么动物可以寻宝 山海经中什么动物可以寻宝穿山甲,盯带穿山甲,古书中称为“鲮鲤”或“龙鲤”。“鲮鲤”“龙鲤”,跟配租“...
可惜那时候年少气盛,的意思 可惜那时候年少气盛,的意思就是——可惜那时候太年轻太冲动太意气用事……多用来表达一种追忆和后悔年少 ...
烟蒂有和天下几个字是什么烟 烟蒂有和天下几个字是什么烟烟蒂有和天下几个字是什么烟烟蒂有和天下几个字是白沙(和天下)很贵的烟哦,1...
如何设置幻灯片翻页时如同翻书一... 如何设置幻灯片翻页时如同翻书一样我在做幻灯片的时候发现别人的幻灯片可以像翻书一样进行切换,这到底是怎...
谁知道“龙有逆鳞,批之者死。”... 谁知道“龙有逆鳞,批之者死。”的意思和出处?呵呵`我明白了就是倒毛的意思比如如果你顺著马毛摸就可以,...
在南宁的大学学生摆摊 在南宁的大学学生摆摊我是南宁某大学学生,我想进货些棉拖,袜子之类的卖。大家觉得去哪进货好啊?还有卖什...