编辑代码

// 设置标准输入接口
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

// 问题描述:模拟复印机队列操作系统
// 输入格式:第一行为操作数n,后面n行每行包含操作类型(IN/OUT)、复印机编号、优先级
// 输出格式:对于每个OUT操作,输出完成打印的任务编号,如果队列为空则输出null

void (async function () {
  // 读取操作数量
  const n = Number(await readline());
  // 存储所有操作
  const lines = [];
  // 读取n行操作指令
  for (let i = 0; i < n; i++) {
    // 解析每行输入:操作类型、复印机编号、任务优先级
    const [sousa, copyNum, num] = (await readline()).split(" ");
    // 将操作信息存入数组,并记录操作序号
    lines.push({ sousa, copyNum, num, index: i + 1 });
  }

  // 创建5个复印机的任务队列数组
  const copyKis = [[], [], [], [], []];
  console.log(copyKis);

  // 处理每个操作
  lines.forEach((line) => {
    if (line.sousa == "IN") {
      // 处理入队操作
      // 获取复印机编号(减1转为数组索引)
      const copyKiNum = Number(line.copyNum);
      // 获取对应复印机的任务队列
      const copyKi = copyKis[copyKiNum - 1];
      // 将任务加入队列,存储任务序号和优先级
      copyKi.push([line.index, Number(line.num)]);
    } else if (line.sousa == "OUT") {
      // 处理出队操作
      // 获取复印机编号(减1转为数组索引)
      const copyKiNum = Number(line.copyNum);
      // 获取对应复印机的任务队列
      const copyKi = copyKis[copyKiNum - 1];

      if (copyKi.length == 0) {
        // 如果队列为空
        console.log(null);
      } else {
        // 按优先级排序任务队列
        copyKi.sort((a, b) => a[1] - b[1]);
        // 取出优先级最高的任务
        const copy = copyKi.pop();
        // 输出完成任务的序号
        console.log(copy[0]);
      }
    }
  });
})();

// 示例说明:
// 输入:
// 5
// IN 1 1    // 复印机1添加优先级为1的任务
// IN 1 2    // 复印机1添加优先级为2的任务
// OUT 1     // 复印机1完成一个任务
// IN 1 3    // 复印机1添加优先级为3的任务
// OUT 1     // 复印机1完成一个任务
//
// 输出:
// [[], [], [], [], []]  // 初始状态的复印机队列
// 1   // 第一个OUT操作完成的任务序号
// 2   // 第二个OUT操作完成的任务序号