当前位置: 首页 > news >正文

华为OD机试真题双机位C卷【打印机队列】 C语言实现

打印机队列

2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型

华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解

其它语言题解链接

华为OD机试双机位C卷 - 打印机队列 (Python & C++ & JAVA & JS & GO)

题目描述

有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)。

输出描述

  • 对于每个测试用例,每次”OUT P”事件,请在一行中输出文件的编号
  • 如果此时没有文件可以打印,请输出”NULL“。
  • 文件的编号定义为”IN P NUM”事件发生第 x 次,此处待打印文件的编号为x。编号从1开始。

用例1

输入

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

输出

3 4 NULL

用例2

输入

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

输出

2

题解

思路

  1. C语言本身不提供优先队列数据结构,解决这道特点(打印机数量固定、 优先级范围固定)决定可以采用自定义优先队列或者下面的分打印机分优先级链表方式解决。
  2. 自定义链表结构体,为每个打印机每个优先级提供一个链表结构。
  3. 接下来就是模拟:
    • 对于IN P NUM操作,找到对应索引printer[P-1][NUM]的链表,使用尾插法。
    • 对于OUT P操作,找到对应printerp[P-1]打印机,按照优先级(10 - 1)顺序循环判断链表是否为空,一旦指定链表不为空,打印文件编号,并删除头节点。如果所有优先级链表都为空输出NULL.
  4. 通过以上步骤即可解决此题。

code

#include<stdio.h>#include<stdlib.h>// 链表节点typedefstructNode{intid;structNode*next;}Node;typedefstructQueue{Node*head,*tail;}Queue;Queue printer[5][11];// 5 台打印机,优先级 1~10intfileId=1;// 插入文件,保存到对应优先级链表中voidenqueue(intp,intpriority){Node*node=(Node*)malloc(sizeof(Node));node->id=fileId++;node->next=NULL;Queue*q=&printer[p-1][priority];if(!q->head){q->head=q->tail=node;}else{q->tail->next=node;q->tail=node;}}// 打印文件voiddequeue(intp){for(intprio=10;prio>=1;prio--){Queue*q=&printer[p-1][prio];if(q->head){Node*node=q->head;printf("%d\n",node->id);q->head=node->next;if(!q->head)q->tail=NULL;free(node);return;}}printf("NULL\n");}intmain(){intN;scanf("%d\n",&N);charcmd[20];intP,NUM;for(inti=0;i<N;i++){fgets(cmd,sizeof(cmd),stdin);if(cmd[0]=='I'){// INsscanf(cmd,"IN %d %d",&P,&NUM);enqueue(P,NUM);}else{// OUTsscanf(cmd,"OUT %d",&P);dequeue(P);}}// 释放剩余节点for(intp=0;p<5;p++)for(intprio=1;prio<=10;prio++){Node*cur=printer[p][prio].head;while(cur){Node*tmp=cur;cur=cur->next;free(tmp);}}return0;}
http://www.jsqmd.com/news/221998/

相关文章:

  • AI如何提升FORTIFY代码扫描效率?
  • yyt0618.15-2019详细解读
  • 【ai搜索】谷歌搜索与数眼智能联网搜索多角度对比
  • AI智能体可能被黑客攻击的 5 种方式(以及如何防范每一种攻击)
  • Thinkphp-Laravel本科生优秀作业交流网站vue
  • Nacos Namespaces未授权访问漏洞的防御策略
  • 模块化多电平变换器MMC(交流380V-直流800V整流)仿真,动稳态性能良好,附带仿真介绍文...
  • 电商大促期间:普罗米修斯监控实战全记录
  • 移远5G-A王炸模组上线!AI+Wi-Fi 8+卫星通信,三重Buff叠满
  • Thinkphp-Laravelvue药品招标采购系统的设计与实现
  • 快速理解 ImportError: libcudart.so.11.0 的定位与修复流程
  • 陪诊小程序开发运营全解析:技术架构+落地逻辑+合规要点
  • 基于正则化极限学习机的数据回归预测算法matlab实现
  • 解决问题 —— 用方程解决复杂应用题专项
  • 高速ADC FMC HPC采集卡ADS54J60,16bit 4通道,原理图PCB代码,F...
  • MATLAB2024B云端体验:免安装即时试用方案
  • python之asynccontextmanager学习
  • Thinkphp-Laravel北京地铁票务APP小程序
  • “入职背景调查”,构建职场信任的第一道防线
  • 更弱智的算法学习 day24
  • 最近在折腾西门子200PLC和施耐德ATV610变频器的Modbus通讯,发现这俩设备配合起来干活是真方便。直接上干货,咱们从最基础的通信配置开始说
  • Thinkphp-Laravel+uniapp微信小程序的毕业论文选题系统设计与实现
  • 西门子水处理1200 PLC程序+触摸屏程序(包含功能块SCL编写及多种功能模块)
  • python之contextmanager
  • Thinkphp-Laravel城市固废垃圾清运车辆管理系统
  • 新手必看:JavaScript堆内存问题入门指南
  • 背调软件如何重塑企业人才风控的底层逻辑
  • Thinkphp-Laravel+uniapp微信小程序的汽车线上车辆租赁管理系统的设计与实现_
  • LISTAGG、XMLAGG
  • 比手动快10倍!自动化处理STEP7许可证问题