2026/4/18 6:43:05
网站建设
项目流程
阿里云做网站步骤,微信小商店分销系统,平面设计素材免费下载,wordpress访问不了打印机队列 2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录#xff5c;机考题库 算法考点详解
其它语言题解链接
华为OD机试双机位C卷 - 打印机队列 (Python C JAVA 机考题库 算法考点详解其它语言题解链接华为OD机试双机位C卷 - 打印机队列 (Python C JAVA JS GO)题目描述有5台打印机打印文件每台打印机有自己的待打印队列。因为打印的文件内容有轻重缓急之分所以队列中的文件有1~10不同的代先级其中数字越大优先级越高。打印机会从自己的待打印队列中选择优先级最高的文件来打印。如果存在两个优先级一样的文件则选择最早进入队列的那个文件。现在请你来模拟这5台打印机的打印过程。输入描述每个输入包含1个测试用例每个测试用例第一行给出发生事件的数量N0 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#includestdio.h#includestdlib.h// 链表节点typedefstructNode{intid;structNode*next;}Node;typedefstructQueue{Node*head,*tail;}Queue;Queue printer[5][11];// 5 台打印机优先级 1~10intfileId1;// 插入文件保存到对应优先级链表中voidenqueue(intp,intpriority){Node*node(Node*)malloc(sizeof(Node));node-idfileId;node-nextNULL;Queue*qprinter[p-1][priority];if(!q-head){q-headq-tailnode;}else{q-tail-nextnode;q-tailnode;}}// 打印文件voiddequeue(intp){for(intprio10;prio1;prio--){Queue*qprinter[p-1][prio];if(q-head){Node*nodeq-head;printf(%d\n,node-id);q-headnode-next;if(!q-head)q-tailNULL;free(node);return;}}printf(NULL\n);}intmain(){intN;scanf(%d\n,N);charcmd[20];intP,NUM;for(inti0;iN;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(intp0;p5;p)for(intprio1;prio10;prio){Node*curprinter[p][prio].head;while(cur){Node*tmpcur;curcur-next;free(tmp);}}return0;}