目录
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Python算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
一、题目描述
有 5 台打印机打印文件,每台打印机有自己的待打印队列。
因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的优先级,其中数字越大优先级越高。
打印机会从自己的待打印队列中选择优先级最高的文件来打印。
如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。
现在请你来模拟这5台打印机的打印过程。
二、输入描述
每个输入包含 1 个测试用例,每个测试用例第 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 次,此处待打印文件的编号为 X。编号从1开始。
四、解题思路
- 读取输入的测试用例数量N。
- 创建一个HashMap,用于存储每个打印机的待打印队列。键是打印机的编号,值是一个包含文件信息的列表。列表中的每个元素是一个整型数组,包含两个元素:文件的优先级和文件的编号。
- 使用一个计数器count,用于记录文件的编号。
- 循环N次,处理每个事件:
- 读取一行输入,将其分割为事件类型和相关参数。
- 如果事件类型是"IN",表示有一个文件放入了待打印队列。将文件的优先级和编号存储到列表中,并将列表存储到HashMap中对应打印机的键值对中。
- 如果事件类型是"OUT",表示打印机进行了一次文件打印。首先检查待打印队列是否为空,如果为空则输出"NULL"。否则,获取待打印队列中优先级最高的文件(优先级最大且编号最小)。输出该文件的编号,并从待打印队列中移除该文件。
- 完成所有事件处理后,结束程序。
该算法的时间复杂度为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、说明
- map放置打印任务 key:打印机的编号,value:type集合
- 如果strs[0] == IN,存入map
- 如果strs[0] == OUT,判断打印机是否存在打印任务
- 如果存在,求出打印机的打印任务,取出第一个元素
- 如果不存在打印任务,输出NULL
🏆下一篇:华为OD机试真题 Python 实现【相对开音节】【2022Q4 100分】,附详细解题思路
🏆本文收录于,华为OD机试(Python)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。