当前位置: 首页 > news >正文

【华为OD机考】华为OD笔试真题解析(17)--打印文件

题目描述

有5台打印机打印文件,每台打印机有自己的待打印队列。因为打印的文件内容有轻重缓急之分,所以队列中的文件有1-10不同的优先级,其中数字越大优先级越高。打印机会从自己的待打印队列中选择优先级最高的文件来打印。如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。

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

输入描述

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

接下来有N行(0 < N < 1000),分别表示发生的事件。共有如下两种事件:

  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 2 3
OUT 1

输出:

2

解题思路

  1. 本题构建多个优先序列,用于表示待打印队列。
  2. 构造一个打印机序列,其中key是打印机编号,value是待打印的优先序列。
  3. 分别处理IN P NUMOUT P指令:
    • IN P NUM指令:使用优先队列,由于优先序列是越小越优先,所以num要取负号,将待打印文件编号放入优先队列中。
    • OUT P指令:从优先队列中取出文件编号,放入结果队列中。
  4. 返回结果队列。

解题代码

import heapq

def solve_method(print_list):
    result = []
    file_id = 1
    # 构造一个打印机序列,其中key是打印机编号,value是待打印的优先序列
    printers = {}
    for command in print_list:
        commands = command.split()
        if commands[0] == "IN":
            p = commands[1]
            num = int(commands[2])
            if p not in printers:
                printers[p] = []
            # 使用优先队列,由于优先序列是越小越优先,所以num要取负号
            heapq.heappush(printers[p], (-num, file_id))
            file_id += 1
        elif commands[0] == "OUT":
            p = commands[1]
            if p in printers and len(printers[p]) > 0:
                # 从优先队列中取出文件编号
                _, file_id = heapq.heappop(printers[p])
                result.append(file_id)
            else:
                result.append("NULL")

    return result


if __name__ == '__main__':
    print_list = [
        "IN 1 1",
        "IN 1 2",
        "IN 1 3",
        "IN 2 1",
        "OUT 1",
        "OUT 2",
        "OUT 2"
    ]
    assert solve_method(print_list) == [3, 4, "NULL"]

    print_list = [
        "IN 1 1",
        "IN 1 3",
        "IN 1 1",
        "IN 2 3",
        "OUT 1"
    ]
    assert solve_method(print_list) == [2]

在这里插入图片描述

相关文章:

  • 2025-03-04 学习记录--C/C++-PTA 习题5-4 使用函数求素数和
  • 手动调整3DTiles倾斜模型的高度、位置、亮度
  • MWC 2025 | 紫光展锐联合移远通信推出全面支持R16特性的5G模组RG620UA-EU
  • HTML label 标签使用
  • 基于微信小程序的心理健康恢复系统+LW示例参考
  • 用DeepSeeker写小说构思 《故事大纲、主线、剧情风格》
  • 无人机遥控器无线传输技术解析!
  • 如何在随机振动分析中包括缓冲器
  • 【MySQL】与MongoDB的区别,字符集,三范式,存储引擎InnoDB、MyISAM
  • 【C++设计模式】第三篇:抽象工厂模式(Abstract Factory)
  • MySQL JOIN 与子查询深度对比:原理、性能陷阱与优化策略
  • 【C++学习篇】智能指针
  • 七、Redis 内存管理详解:模型、优化策略(LRU/LFU、对象共享)
  • 从零开始学 Node.js:完整安装与实战指南
  • vulnhub靶场之【digitalworld.local系列】的JOY靶机
  • 深入解析英文单词“Dime”——从硬币到篮球助攻
  • 滑动窗口法——实践中的BA
  • win10 HV主机服务无法启动(wsl安装失败)
  • 缺陷VS质量:为何软件缺陷是质量属性的致命对立面?
  • Python 图像处理之 Pillow 库:玩转图片
  • 网站刷排名工具/关键词排名代做
  • 网站建设报价分析/网络推广一个月的收入
  • 做网站需要几万吗/百度文库个人登录入口
  • 东莞做营销型网站的/cnzz
  • 肥城网站建设公司/企业网站建站
  • 有哪些做调查问卷赚钱的网站/百度搜索大全