华为OD机试 - 打印机队列 - 优先队列(Python/JS/C/C++ 2024 E卷 200分)

news2024/11/13 10:55:09

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

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

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

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

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

二、输入描述

每个输入包含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:

1、输入

7
IN 1 1
IN 1 2
IN 1 3
IN 2 1
OUT 1
OUT 2
OUT 2

2、输出

3
4
NULL

3、说明

在打印机 1 的队列中插入了 3 个文件,分别有不同的优先级,其中编号 3 的文件优先级最高,先被取出。

在打印机 2 的队列中插入了 1 个文件,优先级为 1,因此它被首先取出。

打印机 2 在第二次 OUT 操作时队列已经为空,因此输出 “NULL”。

测试用例2:

1、输入

6
IN 3 4
IN 3 5
IN 3 5
OUT 3
OUT 3
OUT 3

2、输出

2
3
1

3、说明

  • IN 3 4: 在打印机 3 的队列中插入优先级为 4 的文件,文件编号为 1。
  • IN 3 5: 在打印机 3 的队列中插入优先级为 5 的文件,文件编号为 2。
  • IN 3 5: 在打印机 3 的队列中插入优先级为 5 的文件,文件编号为 3。
  • OUT 3: 打印机 3 中有两个优先级 5 的文件,文件编号为 2 的文件最早插入,输出 2。
  • OUT 3: 剩余优先级最高的文件是编号为 3 的文件(优先级 5),输出 3。
  • OUT 3: 剩下的文件是编号为 1 的文件(优先级 4),输出 1。

测试用例3:

1、输入

4
IN 2 7
IN 2 7
OUT 2
OUT 2

2、输出

1
2

3、说明

两个 IN 操作分别在打印机 2 的队列中插入两个优先级为 7 的文件,编号分别为 1 和 2。

第一个 OUT 操作取出优先级最高且最早进入队列的文件,即编号 1。

第二个 OUT 操作取出剩下的唯一文件,编号为 2。

五、解题思路

这个问题要求模拟打印机的文件调度过程,关键在于正确处理每个打印机队列中的文件优先级和文件进入队列的顺序。在这个过程中,我们需要解决以下几个问题:

优先级处理:每个文件有一个 1 到 10 的优先级,数字越大优先级越高,打印机应首先处理优先级最高的文件。

先进先出原则:如果有多个文件的优先级相同,应该按照它们进入队列的顺序来打印(FIFO - First In First Out)。

2、为什么采用优先队列?

为了管理每个打印机的待打印队列,我们为每台打印机使用一个 PriorityQueue(优先队列)数据结构。

PriorityQueue 是一种适合处理需要频繁获取最高优先级元素的问题的数据结构。它在插入和删除元素时能保持队列中元素的顺序,以便随时可以取出优先级最高的元素。

在 Java 中,PriorityQueue 是一个基于堆(Heap)的实现,默认是小顶堆(最小优先队列),因此我们需要自定义比较器来实现大顶堆的行为(最大优先队列)。

3、具体步骤:

  1. 创建 5 个 PriorityQueue 对象并存储在列表中,每个 PriorityQueue 用于管理对应打印机的打印任务。
  2. 对于 IN 事件,将文件加入对应打印机的队列,并根据文件的优先级进行排序。
  3. 对于 OUT 事件,从对应打印机的队列中取出优先级最高的文件,如果队列为空则输出 “NULL”。
  4. 根据处理结果输出文件编号或 “NULL”。

六、Python算法源码

import heapq  # 导入heapq模块,用于创建优先队列

# 自定义类表示一个打印任务
class PrintJob:
    def __init__(self, priority, id):
        # 初始化优先级和文件编号
        self.priority = priority
        self.id = id

    # 定义比较规则,用于在优先队列中排序
    def __lt__(self, other):
        if self.priority != other.priority:
            return self.priority > other.priority  # 优先级高的任务优先处理
        return self.id < other.id  # 优先级相同时,编号小的任务优先处理

def main():
    N = int(input().strip())  # 读取事件数量,并去除多余的空格
    
    # 初始化5个打印机的优先队列,每个队列用列表表示
    printers = [[] for _ in range(5)]
    jobId = 1  # 文件编号从1开始
    output = []  # 用于存储输出的结果

    # 处理每个事件
    for _ in range(N):
        parts = input().split()  # 按空格分割输入
        command = parts[0]  # 获取命令类型
        printerIndex = int(parts[1]) - 1  # 获取打印机编号,并转换为0-4的索引

        if command == "IN":
            priority = int(parts[2])  # 获取任务优先级
            # 将新的打印任务加入到对应的打印机队列中
            heapq.heappush(printers[printerIndex], PrintJob(priority, jobId))
            jobId += 1  # 文件编号递增
        elif command == "OUT":
            # 检查对应打印机队列是否为空
            if printers[printerIndex]:
                # 输出优先级最高的文件编号
                output.append(str(heapq.heappop(printers[printerIndex]).id))
            else:
                output.append("NULL")  # 如果队列为空,输出"NULL"

    # 打印最终的输出结果,每个结果占一行
    print("\n".join(output))

if __name__ == "__main__":
    main()

七、JavaScript算法源码

// 定义一个类表示打印任务
class PrintJob {
    constructor(priority, id) {
        this.priority = priority; // 初始化优先级
        this.id = id;             // 初始化文件编号
    }
}

// 定义一个优先队列类,用于管理打印任务
class PriorityQueue {
    constructor() {
        this.queue = [];  // 初始化为空数组
    }

    // 将任务加入队列,并根据优先级排序
    offer(job) {
        this.queue.push(job);
        this.queue.sort((a, b) => {
            if (a.priority !== b.priority) return b.priority - a.priority;  // 优先级高的排前面
            return a.id - b.id;  // 如果优先级相同,文件编号小的排前面
        });
    }

    // 取出优先级最高的任务
    poll() {
        return this.queue.shift();  // 从队列头部取出任务
    }

    // 判断队列是否为空
    isEmpty() {
        return this.queue.length === 0;  // 如果队列长度为0,则为空
    }
}

function main() {
    const input = require('fs').readFileSync('/dev/stdin', 'utf8').trim().split('\n'); // 读取输入
    const N = parseInt(input[0].trim());  // 获取事件数量
    const printers = Array.from({ length: 5 }, () => new PriorityQueue());  // 初始化5个打印机
    let jobId = 1;  // 文件编号从1开始
    let output = [];  // 存储输出结果

    for (let i = 1; i <= N; i++) {
        const parts = input[i].split(' ');  // 按空格分割每行输入
        const command = parts[0];  // 获取命令类型
        const printerIndex = parseInt(parts[1]) - 1;  // 将打印机编号转为索引

        if (command === "IN") {
            const priority = parseInt(parts[2]);  // 获取任务优先级
            printers[printerIndex].offer(new PrintJob(priority, jobId++));  // 创建并加入新任务
        } else if (command === "OUT") {
            if (!printers[printerIndex].isEmpty()) {
                output.push(printers[printerIndex].poll().id);  // 输出文件编号
            } else {
                output.push("NULL");  // 队列为空时输出NULL
            }
        }
    }

    console.log(output.join('\n'));  // 输出结果
}

main();

八、C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义结构体表示打印任务
typedef struct {
    int priority;  // 优先级
    int id;        // 文件编号
} PrintJob;

// 比较函数,用于任务排序
int compare(const void *a, const void *b) {
    PrintJob *jobA = (PrintJob *)a;
    PrintJob *jobB = (PrintJob *)b;
    if (jobA->priority != jobB->priority)
        return jobB->priority - jobA->priority;  // 优先级高的排在前
    return jobA->id - jobB->id;  // 编号小的排在前
}

// 定义优先队列结构体
typedef struct {
    PrintJob jobs[1000];  // 存储任务的数组
    int size;             // 当前队列中的任务数
} PriorityQueue;

// 将新任务加入优先队列,并排序
void push(PriorityQueue *pq, PrintJob job) {
    pq->jobs[pq->size++] = job;
    qsort(pq->jobs, pq->size, sizeof(PrintJob), compare);  // 排序
}

// 取出优先级最高的任务
PrintJob pop(PriorityQueue *pq) {
    return pq->jobs[--pq->size];  // 返回最后一个任务
}

// 判断队列是否为空
int isEmpty(PriorityQueue *pq) {
    return pq->size == 0;  // 如果任务数为0,则队列为空
}

int main() {
    int N;
    scanf("%d", &N);  // 读取事件数量
    
    PriorityQueue printers[5] = {0};  // 初始化5个打印机队列
    int jobId = 1;  // 文件编号从1开始

    for (int i = 0; i < N; i++) {
        char command[4];
        int printerIndex;
        scanf("%s %d", command, &printerIndex);  // 读取命令和打印机编号
        printerIndex--;  // 将打印机编号转换为索引

        if (strcmp(command, "IN") == 0) {
            int priority;
            scanf("%d", &priority);  // 获取任务优先级
            PrintJob newJob = {priority, jobId++};  // 创建新任务
            push(&printers[printerIndex], newJob);  // 将任务加入队列
        } else if (strcmp(command, "OUT") == 0) {
            if (!isEmpty(&printers[printerIndex])) {
                PrintJob job = pop(&printers[printerIndex]);  // 取出优先级最高的任务
                printf("%d\n", job.id);  // 输出任务编号
            } else {
                printf("NULL\n");  // 队列为空时输出NULL
            }
        }
    }

    return 0;
}

九、C++算法源码

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

// 定义结构体表示打印任务
struct PrintJob {
    int priority;  // 优先级
    int id;        // 文件编号

    // 自定义比较函数,用于优先队列排序
    bool operator<(const PrintJob &other) const {
        if (priority != other.priority) {
            return priority < other.priority;  // 优先级高的任务优先处理
        }
        return id > other.id;  // 优先级相同时,编号小的任务优先处理
    }
};

int main() {
    int N;
    cin >> N;  // 读取事件数量
    cin.ignore();  // 消耗换行符

    vector<priority_queue<PrintJob>> printers(5);  // 初始化5个打印机队列
    int jobId = 1;  // 文件编号从1开始
    string command;
    int printerIndex;

    for (int i = 0; i < N; ++i) {
        cin >> command >> printerIndex;  // 读取命令和打印机编号
        printerIndex--;  // 将打印机编号转换为索引

        if (command == "IN") {
            int priority;
            cin >> priority;  // 读取任务优先级
            printers[printerIndex].push({priority, jobId++});  // 创建并加入新任务
        } else if (command == "OUT") {
            if (!printers[printerIndex].empty()) {
                cout << printers[printerIndex].top().id << endl;  // 输出任务编号
                printers[printerIndex].pop();  // 移除任务
            } else {
                cout << "NULL" << endl;  // 如果队列为空,输出"NULL"
            }
        }
    }

    return 0;
}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2147138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阻止冒泡事件

每一div都有一个切换事件 div里包括【复制】事件&#xff0c; 点击【复制按钮】&#xff0c;会触发【切换事件】 因为冒泡 在 Vue 3 中&#xff0c;阻止 click 事件冒泡可以使用以下常规方法&#xff1a; 1 事件修饰符&#xff1a;Vue 3 中提供了多种事件修饰符&#xff0c…

Java入门:09.Java中三大特性(封装、继承、多态)02

2 继承 需要两个类才能实现继承的效果。 比如&#xff1a;类A 继承 类B A类 称为 子类 &#xff0c; 衍生类&#xff0c;派生类 B类 称为 父类&#xff0c;基类&#xff0c;超类 继承的作用 子类自动的拥有父类的所有属性和方法 &#xff08;父类编写&#xff0c;子类不需要…

实验2 Linux文件系统常用操作实践

实验2 Linux文件系统常用操作实践 一、实验介绍 本节实验通过实战Linux文件操作模块的基本操作,需要先掌握linux文件系统的原理以及理解linux文件操作的原理,最后通过实操完成linux文件操作的命令,其中包括改变目录、创建目录及文件、删除文件、复制文件、文件移动和改名、查…

BPG的定义和工作原理是什么?

在当今互联网中&#xff0c;网络通信的关键角色之一是BGP&#xff08;边界网关协议&#xff09;。BGP是一种路由矢量协议&#xff0c;负责在自治系统之间交换路由信息&#xff0c;并帮助数据包找到通过网络的理想链路。本文将介绍BGP、BGP4和BGP4&#xff0c;以及它们在网络中的…

记录生产环境,通过域名访问的图片展示不全,通过ip+端口的方式访问图片是完整的

原因&#xff1a;部署nginx的服务器硬盘满了 排查发现nginx日志文件占用了大量硬盘 解决方案&#xff1a; 删除该文件&#xff0c;重启nginx服务&#xff0c;问题解决。

郑重申明《数据资产管理核心技术与应用》一书在拼多多上被盗版售卖,恳请大家支持正版和作者的著作权权益

《数据资产管理核心技术与应用》是清华大学出版社出版的一本图书&#xff0c;作者为张永清等著&#xff0c;近期我本人在拼多多上很多不同的店铺中都买到了这本书的盗版版本&#xff0c;购书的原因是想从市场上购买一批本书送给忠实的读者和身边的朋友&#xff0c;但是发现买到…

pdf图片怎么提取出来?这6个pdf图片提取工具全搞定,值得推荐!

在我们的日常办公和学习中&#xff0c;pdf文件成为了信息传递的重要载体。然而&#xff0c;有时我们在pdf文档中发现一些精彩的图片&#xff0c;想将其提取出来供个人使用或分享给他人。无论是为了更灵活的处理&#xff0c;还是为了发送特定的图像&#xff0c;提取pdf中的图片都…

使用streaming-json-py插件处理JSON数据流:详细指南

目录 一、streaming-json-py简介 二、安装与配置 三、基本使用 示例1:处理不完整的JSON对象 示例2:处理不完整的JSON数组 四、高级用法 实时数据流分析 日志处理 五、性能优化与错误处理 六、总结与展望 在数据驱动的现代社会,实时处理数据流已成为许多应用和服务…

中国大气湿度指数数据集(2003-2020)

该数据集收录了2003-2020年中国大气湿度指数数据集&#xff0c;其中主要包括常用的5个大气湿度指数&#xff1a;真是水汽压&#xff08;AVP&#xff09;、水汽压亏缺&#xff08;VPD&#xff09;、露点温度&#xff08;DPT&#xff09;、混合比&#xff08;MR&#xff09;以及比…

HTML入门笔记

概述 HTML&#xff08;超文本标记语言—HyperText Markup Language&#xff09;是构成 Web 世界的基础&#xff0c;是一种用来告知浏览器如何组织页面的标记语言。 超文本 Hypertext&#xff1a;指连接单个或多个网站间的网页链接&#xff0c;通过这些链接可以访问互联网中的…

【算法题】322.零钱兑换-力扣(LeetCode)

【算法题】322.零钱兑换-力扣(LeetCode) 1.题目 下方是力扣官方题目的地址 322.零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任…

二百六十七、MySQL——海豚调度器创建MySQL库表

一、目的 为了方便部署&#xff0c;直接用海豚创建MySQL库表 二、实施步骤 2.1 准备好SQL文件&#xff0c;并上传海豚中 create database if not exists hurys_dc; use hurys_dc; SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; CREATE TABLE tb_holiday ( id int NOT …

城市脉络下的空间句法:中介中心性、接近中心性与绕行率的深度解析

这一篇是对上篇内容的继续深化&#xff0c;也就是sDNA “整体分析”&#xff08;Integral Analysis&#xff09;计算结果代表的意思&#xff0c;有哪些&#xff1f;意义是什么&#xff1f; 上篇文章指路&#xff1a;城市脉络下的空间句法&#xff1a;整合度与选择度的深度解析…

02:【HAL库】OLED模块的简单使用

将江科大的OLED标准库代码移植为HAL库代码 如上图所示&#xff1a;江科大将PB8和PB9配置为通用开漏输出&#xff0c;然后通过程序模拟I2C时序。 1、我们通过CubxMX软件将PB8和PB9也配置为通用开漏输出&#xff0c;其他的代码不变。 2、我们将江科大的OLED.c&#xff0c;OLED.h&…

关于循环Socket创建超Linux文件句柄限制现象分析

项目场景&#xff1a; 在操作系统的世界中万物皆文件。之前拜读过一些作品&#xff1a;针对于socket的创建&#xff0c;Linux也相应创建文件&#xff08;专业术语中也称文件句柄&#xff09;&#xff0c;于是&#xff0c;我想做一些关于极限的操作&#xff0c;看看这些极限操作…

优化数据的抓取规则:减少无效请求

在爬取房价信息的过程中&#xff0c;如何有效过滤无效链接、减少冗余请求&#xff0c;是提升数据抓取效率的关键。本文将介绍如何优化爬虫抓取贝壳等二手房平台中的房价、小区信息&#xff0c;并通过代理IP、多线程、User-Agent和Cookies的设置&#xff0c;确保数据抓取的稳定性…

聊聊Netty对于内存方面的优化

写在文章开头 Netty通过巧妙的内存使用技巧尽可能节约内存空间,进而减少java中Full gc的STW的时间,由此间接的提升了程序的性能,本文也将直接从源码的角度分析一下Netty对于内存方面的使用技巧,希望对你有所启发。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java…

解决Filament中使用ARCore出现绿色闪屏的问题

解决Filament中使用ARCore出现绿色闪屏的问题 问题现象 使用AR的工程中&#xff0c;出现绿屏闪烁。问题帧截图如下&#xff1a; 问题定位 问题来源 在filament的1.21.0之前的版本&#xff0c;Stream对象提供了stream(long externalTextureId)方法&#xff0c;允许传递一个…

U盘显示未被格式化:深度解析与数据恢复指南

一、现象解析&#xff1a;U盘显示未被格式化之谜 在日常使用U盘的过程中&#xff0c;不少用户可能会遭遇一个令人头疼的问题——插入U盘后&#xff0c;系统提示“U盘未被格式化”&#xff0c;要求用户进行格式化操作以继续访问。这一突如其来的提示不仅打断了正常的工作流程&a…

[邀请函]2024上海工博会,盟通邀您共享盛典!

展会基本情况 9月24-28日&#xff0c;2024年中国国际工业博览会&#xff08;简称"中国工博会"&#xff09;将在国家会展中心&#xff08;上海&#xff09;拉开帷幕。展会设9大专业展&#xff0c;数控机床与金属加工展、工业自动化展、节能与工业配套展、新一代信息技…