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