首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >优先队列-打印机队列

优先队列-打印机队列

原创
作者头像
Swing Dunn
发布2025-11-07 16:41:07
发布2025-11-07 16:41:07
3000
举报
文章被收录于专栏:刷点题15天(一)刷点题15天(一)

优先队列queue.PriorityQueue ,树形结构,每次弹出的都是优先级最高(低)的节点

代码语言:txt
复制
# 有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 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档