题目描述
有5台打印机打印文件,每台打印机有自己的待打印队列。
因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的代先级,其中数字越大优先级越高。
打印机会从自己的待打印队列中选择优先级最高的文件来打印。
如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。
现在请你来模拟这5台打印机的打印过程。
输入描述
每个输入包含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 次
输入格式为:
6
IN 1 2
IN 3 4
IN 1 5
OUT 1
OUT 3
OUT 3
输出格式为:
3
2
NULL
解决代码 (不保证正确)
事后我想起来我之前错在哪了, 当时测试用例只过了20%, 这个应该能过80~90%以上
var readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
var inputs = [];
var inputsNum = 0;
var printMapQueue = {
1: [], // {key: xx, n: number}
2: [],
3: [],
4: [],
5: [],
};
function fn() {
let inputCount = 0;
for (let i = 0; i < inputs.length; i++) {
let item = inputs[i];
if (item.opt === "IN") {
let p = item.P;
let n = item.N;
++inputCount;
let index = printMapQueue[p].length;
for (let j = 0; j < printMapQueue[p].length; j++) {
let item = printMapQueue[p][j];
if (n > item.n) {
index = j;
break;
}
}
printMapQueue[p].splice(index, 0, { n: n, key: inputCount });
} else if (item.opt === "OUT") {
let p = item.P;
let print = printMapQueue[p];
if (print.length) {
let item = print.shift();
console.log(item.key);
} else {
console.log("NULL");
}
}
}
}
rl.on("line", function (line) {
var tokens = line.split(" ");
if (inputsNum === 0) {
inputsNum = +tokens[0];
} else {
inputs.push({
opt: tokens[0],
P: +tokens[1],
N: tokens[2] ? +tokens[2] : 0,
});
}
if (inputs.length === inputsNum) {
fn();
}
});
这个测试用例只通过20%
代码问题是我对IN,OUT分组了(///▽///),没有线性处理,一比如IN A 1,IN A 2,OUT A 这个时候 返回 2,没问题,如果测试用例是OUT A,IN A 1,IN A 2,正确应该返回 NULL,而我的还是返回2
var readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
var inputs = {
IN: [],
OUT: []
}
var inputsNum = 0
var printMapQueue = {
1: [], // {key: xx, n: number}
2: [],
3: [],
4: [],
5: []
}
function fn(){
for(let i = 0; i < inputs.IN.length; i++){
let p = inputs.IN[i].P;
let n = inputs.IN[i].N;
let printKey = i + 1;
let index = printMapQueue[p].length;
for(let j = 0; j < printMapQueue[p].length; j++){
let item = printMapQueue[p][j]
if(n > item.n){
index = j
break;
}
}
printMapQueue[p].splice(index, 0, {n: n, key: printKey})
}
for(let i = 0; i < inputs.OUT.length; i++){
let p = inputs.OUT[i].P;
let print = printMapQueue[p];
if(print.length){
let item = print.shift();
console.log(item.key)
}else{
console.log("NULL")
}
}
}
rl.on('line', function(line){
var tokens = line.split(" ");
if(inputsNum === 0){
inputsNum = +tokens[0]
}else{
inputs[tokens[0]].push({
P: +tokens[1],
N: tokens[2] ? +tokens[2] : 0
})
}
if(inputs.IN.length + inputs.OUT.length === inputsNum){
fn()
}
});