优先队列queue.PriorityQueue ,树形结构,每次弹出的都是优先级最高(低)的节点
# 有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)。
# 7
# IN 1 1
# IN 1 2
# IN 1 3
# IN 2 1
# OUT 1
# OUT 2
# OUT 2
# 对于每个测试用例,每次”OUT P”事件,请在一行中输出文件的编号。
# 如果此时没有文件可以打印,请输出”NULL“。
# 文件的编号定义为”IN P NUM”事件发生第 x 次,此处待打印文件的编号为x。编号从1开始
# 3
# 4
# NULL
import queue
class Task:
def __init__(self, taskid, priority, index):
self.taskid = taskid
self.priority = priority
self.index = index
def __lt__(self, other):
if self.priority != other.priority:
return self.priority > other.priority
else:
return self.index < other.index
n = int(input())
tasks = list()
for i in range(n):
tasks.append(input().split())
def getResult(tasks):
printer ={}
taskid = 1
for i in range(len(tasks)):
task = tasks[i]
type = task[0]
printerid = task[1]
if type == 'IN':
priority = task[2]
if printer.get(printerid) is None:
printer[printerid] = queue.PriorityQueue()
printer[printerid].put(Task(taskid, priority, i))
taskid += 1
else:
if printer.get(printerid) is None or printer[printerid].qsize() == 0:
print('NULL')
else:
t = printer[printerid].get()
print(t.taskid)
getResult(tasks)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。