华为OD机试真题 Python 实现【打印文件】【2023Q1 100分】,附详细解题思路-LMLPHP

一、题目描述

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

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

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

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

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

二、输入描述

每个输入包含 1 个测试用例,每个测试用例第 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开始。

四、解题思路

  1. 读取输入的测试用例数量N。
  2. 创建一个HashMap,用于存储每个打印机的待打印队列。键是打印机的编号,值是一个包含文件信息的列表。列表中的每个元素是一个整型数组,包含两个元素:文件的优先级和文件的编号。
  3. 使用一个计数器count,用于记录文件的编号。
  4. 循环N次,处理每个事件:
    • 读取一行输入,将其分割为事件类型和相关参数。
    • 如果事件类型是"IN",表示有一个文件放入了待打印队列。将文件的优先级和编号存储到列表中,并将列表存储到HashMap中对应打印机的键值对中。
    • 如果事件类型是"OUT",表示打印机进行了一次文件打印。首先检查待打印队列是否为空,如果为空则输出"NULL"。否则,获取待打印队列中优先级最高的文件(优先级最大且编号最小)。输出该文件的编号,并从待打印队列中移除该文件。
  5. 完成所有事件处理后,结束程序。

该算法的时间复杂度为O(NlogM),其中N是事件数量,M是待打印队列中文件的平均数量。每次处理OUT事件时,需要对待打印队列中的文件按优先级进行排序,时间复杂度为O(MlogM)。最终的空间复杂度取决于待打印队列中文件的总数量,即O(M)

五、Python算法源码

n = int(input())
file = {x:[] for x in range(6)}
p = {x:[] for x in range(6)}
out = []
s = 0
for i in range(n):
    a = list(input().split())
    if a[0] == 'IN':
        s += 1
        file[int(a[1])].append(int(a[2]))
        p[int(a[1])].append(s)
    else:
        j = int(a[1])
        if file[j]:
            ans = max(file[j])
            b = 0
            for k in range(len(file[j])):
                if file[j][k] == ans:
                    b = k
                    break
            print(p[j][b])
            file[j].remove(file[j][b])
            p[j].remove(p[j][b])
        else:
            print('NULL')

六、效果展示

1、输入

5
IN 1 2
IN 1 3
IN 1 2
IN 1 3
OUT 1

2、输出

2

3、说明

  1. map放置打印任务 key:打印机的编号,value:type集合
  2. 如果strs[0] == IN,存入map
  3. 如果strs[0] == OUT,判断打印机是否存在打印任务
  4. 如果存在,求出打印机的打印任务,取出第一个元素
  5. 如果不存在打印任务,输出NULL

华为OD机试真题 Python 实现【打印文件】【2023Q1 100分】,附详细解题思路-LMLPHP


🏆下一篇:华为OD机试真题 Python 实现【相对开音节】【2022Q4 100分】,附详细解题思路

🏆本文收录于,华为OD机试(Python)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

华为OD机试真题 Python 实现【打印文件】【2023Q1 100分】,附详细解题思路-LMLPHP

07-04 02:48