7-2 银行排队问题之单窗口“夹塞”版 (30 分)

PTA
排队“夹塞”是引起大家强烈不满的行为,但是这种现象时常存在。在银行的单窗口排队问题中,假设银行只有1个窗口提供服务,所有顾客按到达时间排成一条长龙。当窗口空闲时,下一位顾客即去该窗口处理事务。此时如果已知第i位顾客与排在后面的第j位顾客是好朋友,并且愿意替朋友办理事务的话,那么第i位顾客的事务处理时间就是自己的事务加朋友的事务所耗时间的总和。在这种情况下,顾客的等待时间就可能被影响。假设所有人到达银行时,若没有空窗口,都会请求排在最前面的朋友帮忙(包括正在窗口接受服务的朋友);当有不止一位朋友请求某位顾客帮忙时,该顾客会根据自己朋友请求的顺序来依次处理事务。试编写程序模拟这种现象,并计算顾客的平均等待时间。

输入格式:

输入的第一行是两个整数:1≤N≤10000,为顾客总数;0≤M≤100,为彼此不相交的朋友圈子个数。若M非0,则此后M行,每行先给出正整数2≤L≤100,代表该圈子里朋友的总数,随后给出该朋友圈里的L位朋友的名字。名字由3个大写英文字母组成,名字间用1个空格分隔。最后N行给出N位顾客的姓名、到达时间T和事务处理时间P(以分钟为单位),之间用1个空格分隔。简单起见,这里假设顾客信息是按照到达时间先后顺序给出的(有并列时间的按照给出顺序排队),并且假设每个事务最多占用窗口服务60分钟(如果超过则按60分钟计算)。

输出格式:

按顾客接受服务的顺序输出顾客名字,每个名字占1行。最后一行输出所有顾客的平均等待时间,保留到小数点后1位。

输入样例:

6 2
3 ANN BOB JOE
2 JIM ZOE
JIM 0 20
BOB 0 15
ANN 0 30
AMY 0 2
ZOE 1 61
JOE 3 10

输出样例:

JIM
ZOE
BOB
ANN
JOE
AMY
75.2

题解:思路在注释里,就不在这里写了。

#include <bits/stdc++.h>    //双向链表实现,本题还有一个更好的优化方法,可以通过记录朋友属性的次数来忽略不必要的搜索
using namespace std;
typedef struct consumer
{char name[5];double arrive;double start;double process;double end;double wait;struct consumer *next; //朋友找人帮忙看的是end,输出看的是start. struct consumer *prior;
}List;
int main()
{int n,m;char name[5];int record[60][60][60]={0};  //这个数组每一个下标代表着名字的每一个字母,数组元素存放着共同属性---是不是朋友,一种更为简单的方法是使用map函数List *head=NULL,*tail,*p;    //本机调试不减65很容易段错误,可能是三维数组的特性?cin>>n>>m;for (int i=1;i<=m;i++)   //输入朋友圈 {int k;cin>>k;for (int j=0;j<k;j++){getchar();scanf("%s",name);record[name[0]-65][name[1]-65][name[2]-65]=i;}}double arrive,process,lastendtime=0;for (int i=0;i<n;i++)   //每个人的信息并在输入的过程中查看前面有没有朋友 {                       //有没有朋友指自己的到达时间比朋友离开的时间要早,即下面的判断条件 int flag=0;         //record[temp->name[0]-65][temp->name[1]-65][temp->name[2]-65]==record[p->name[0]-65][p->name[1]-65][p->name[2]-65]&&p->arrive<=temp->endscanf("%s%lf%lf",name,&arrive,&process);if (process>60) process=60;p=(List *)malloc(sizeof(List));   //为朋友节点赋值 p->next=NULL;p->prior=NULL;strcpy(p->name,name);p->arrive=arrive;p->process=process;if (i==0)                        //第一个人一定是一来就被处理 {p->start=p->arrive;}else                            //lastendtime是窗口的availiable的时间 {if (p->arrive<=lastendtime)    //到的时间比availiable时间早,那么需要等一会,一有空就去处理 p->start=lastendtime;else                          //这是窗口有一段空的时间,来了就处理,同时要注意下边56行对lastendtime的刷新 p->start=p->arrive;}p->end=p->start+p->process;       //结束时间 lastendtime=p->end;              //刷新 p->wait=p->start-p->arrive;        //计算此人的等待时间 if (p->wait<0)   p->wait=0;        //如果等待时间为负,那么说明来的比lastendtime晚,没等待(注:实际上,53行已考虑了) if (head==NULL)       //插入 {head=p;tail=p;            //别忘了,不然后面的插入会发生段错误 }else{for (List *temp=tail;temp!=NULL;temp=temp->prior)   //找朋友 {if (record[temp->name[0]-65][temp->name[1]-65][temp->name[2]-65]==record[p->name[0]-65][p->name[1]-65][p->name[2]-65]&&p->arrive<=temp->end)   //temp处是要插入的前一个位置 {   //如果二人属性相同并且后来者是赶在朋友走之前来的 flag=1;  //需要在前面插入 for (List *rr=temp->next;rr!=NULL;rr=rr->next)   //temp是他的朋友,在这个人加塞后,后面的每个人都要 {											//加时长 rr->start+=p->process;rr->end+=p->process;rr->wait=rr->start-rr->arrive;if (rr->wait<=0) rr->wait=0;}if (temp->next==NULL)    //样例中BOB和ANN的情况,如果朋友也在最后,那么tail要移动到这个人 {tail=p;}p->start=temp->end;           //朋友的结束就是此人的开始 p->end=p->start+p->process;   //刷新此人的所有信息(82-84) p->wait=p->start-p->arrive;if (p->wait<0) p->wait=0;p->next=temp->next;if (temp->next!=NULL)    //连接,画图理解 temp->next->prior=p;p->prior=temp;temp->next=p;break;}}if (flag==0)   //此人没有找到朋友,可怜,只能尾插 {p->prior=tail;tail->next=p;tail=p;}}}for (List *tt=head;tt!=NULL;tt=tt->next)   //输出名字 {printf("%s\n",tt->name);}double sum=0;for (List *temp=head;temp!=NULL;temp=temp->next)  //计算总等待时间 { sum+=temp->wait;}printf("%.1lf",sum/n);return 0;
}

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

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

相关文章

数学认知中的具身进路及其哲学观初探

来源&#xff1a;《科学技术哲学研究》2020年第6期作者&#xff1a;王东&#xff08;北京工商大学马克思主义学院&#xff09;吴彤&#xff08;清华大学人文学院&#xff09;国家社会科学基金重大课题“科学实践哲学与地方性知识研究”(13&ZD068)从数学思想史以及数学哲学的…

Flink编程入门(二)

Flink 有三种部署模式&#xff0c;分别是 Local、Standalone Cluster 和 Yarn Cluster。 1.1. Local模式 对于 Local 模式来说&#xff0c;JobManager 和 TaskManager 会公用一个 JVM 来完成 Workload。如果要验证一个简单的应用&#xff0c;Local 模式是最方便的。实际应用中大…

7-4 银行排队问题之单队列多窗口加VIP服务 (30 分)

7-4 银行排队问题之单队列多窗口加VIP服务 (30 分) 说实话这道题挺恶心 有意思的&#xff0c;大模拟&#xff0c;主要的思路就是模拟时间轴。 题目描述 假设银行有K个窗口提供服务&#xff0c;窗口前设一条黄线&#xff0c;所有顾客按到达时间在黄线后排成一条长龙。当有窗口…

线程同步-互锁函数

互锁函数&#xff1a; LONG InterlockedIncrement&#xff08;LONG volatile* Addend&#xff09;&#xff1a;递增指定32位变量&#xff0c;增量位1&#xff0c;可以阻止其他线程同时使用此变量&#xff1b;LONG InterlockedDecrement&#xff08;LONG volatile* Addend&#…

李德毅院士:探索新一代人工智能产业发展

来源&#xff1a;主线科技2021年5月14日&#xff0c;主线科技联合中国人工智能学会智驾专委会正式发起成立“新一代人工智能物流创新中心”&#xff0c;并携手福佑卡车开启中国首个干线物流自动驾驶商业项目。在此次活动上&#xff0c;中国工程院院士、CAAI名誉理事长、主线科技…

1.修理牧场

农夫要修理牧场的一段栅栏&#xff0c;他测量了栅栏&#xff0c;发现需要N块木头&#xff0c;每块木头长度为整数L​i个长度单位&#xff0c;于是他购买了一条很长的、能锯成N块的木头&#xff0c;即该木头的长度是Li​​ 的总和。 但是农夫自己没有锯子&#xff0c;请人锯木的…

线程同步-事件内核对象

事件内核对象&#xff1a;两种状态&#xff0c;受信状态与未受信状态&#xff0c;3个成员&#xff1b; nUsageCount&#xff08;使用计数&#xff09;&#xff1b;bManualReset&#xff08;是否人工重置&#xff09;&#xff1b;bSignagled&#xff08;是否受信&#xff09;。基…

yii2.0AR两表联查

首先&#xff0c;建两个关联表。 表一 -- Table structure for article -- ---------------------------- DROP TABLE IF EXISTS article; CREATE TABLE article ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增id, new text, t_id int(11) DEFAULT NULL COMMENT 关联id, P…

AI产业链全景图!【物联网智商精选】

来源&#xff1a;ittbankAI产业链全景图最后给大家介绍一款英伟达高性能AI边缘计算超级计算机模块&#xff1a;NVIDIA JETSON TX2Jetson TX2是NIVDIA瞄准人工智能在Jetson TK1和TX1推出后的升级TX2的GPU和CPU都进行了升级&#xff0c;内存增加到了8GB、存储增加到了32GB&#…

7-2 哈夫曼编码 (30 分)

2019.12.15更正Best函数样本数据初始化问题并且对代码添加了注释; 2020.11.17更正&#xff1a;题目说明&#xff1b; 原贴发于2019.11.22 注意&#xff1a;本题不是哈夫曼编码裸题&#xff0c;学习哈夫曼编码的同学不要过度依赖本题算法&#xff0c;只有参考价值&#xff1b; 给…

通用AI咋发展?向大脑学习是条路子

来源&#xff1a;中国科学报作者&#xff1a;郑金武编辑&#xff1a;赵路排版&#xff1a;志海作为代表自然界拥有最通用智能的生物大脑&#xff0c;可以借助低功耗和少量后天数据&#xff0c;实现在复杂环境下执行复杂任务的智能行为。因此&#xff0c;探索生物大脑智能认知的…

Oracle:select into 查询没有记录的解决办法

在数据库编程中&#xff0c;select into 语句可以将数据库的某些值赋值给程序的变量&#xff0c;使用起来非常方便。但很多时候也会遇到查询出来没有记录的情况&#xff0c;这时程序会出错。 可以使用 exception when NO_DATA_FOUND then 但是如merge into using 查不到时可以使…

MFC随机博弈黑白棋

随机博弈黑白棋 随机博弈黑白棋 TxyITxs | 随机博弈黑白棋 | 2019.04.21 摘要 通过随机落子&#xff0c;实现黑白棋的博弈。无任何落子规则&#xff0c;棋子死活与围棋中棋子的死活一致&#xff0c;即存在至少一口气。动态模拟双方博弈&#xff0c;但棋盘无落子位置时停止。…

7-3 喊山 (30 分)

搞了好几天心态的一道题&#xff0c;还是菜&#xff0c;原因就是想复杂了&#xff0c;第一次遇到了内存超限的问题&#xff0c;把邻接矩阵由二维数组换成了vector才过的。 7-3 喊山 (30 分) 喊山&#xff0c;是人双手围在嘴边成喇叭状&#xff0c;对着远方高山发出“喂—喂喂…

章鱼有9个大脑能编辑基因,智商高到无法理解,为何没发展出文明

来源&#xff1a;科学杂志按照进化论的观点&#xff0c;生物演化出脊椎&#xff0c;是发展出更高智商的敲门砖。因为脊椎让生物体内的神经高度集中&#xff0c;反应速度明显加快&#xff0c;并且还有利于大脑向更加高级的结构演化。事实也确实如此&#xff0c;如果盘点世界上最…

Python运算符与编码

while循环 1.基本循环while 条件: 循环体如果条件为真&#xff0c;那么循环则执行如果条件为假&#xff0c;那么循环不执行 while循环代码体现形式while 3>2:print(在人间) num 1  while num<101:  print(num)  num num 1 break 终止  continue 跳出本次循环,…

Windows坐标系统

坐标映射方式是设备环境中的一个重要属性&#xff0c;默认值为MM_TEXT&#xff0c;即左上角为原点&#xff0c;右方为x轴正方向&#xff0c;下方为y轴正方向&#xff0c;这种坐标系使用的单位是像素&#xff0c;其好处是窗口中的每一点的坐标不会因为窗口大小而改变。 映射方法…

7-1 公路村村通 (30 分)

现有村落间道路的统计数据表中&#xff0c;列出了有可能建设成标准公路的若干条道路的成本&#xff0c;求使每个村落都有公路连通所需要的最低成本。 输入格式: 输入数据包括城镇数目正整数N&#xff08;≤1000&#xff09;和候选道路数目M&#xff08;≤3N&#xff09;&#…

华为徐文伟:用数学和系统工程方法推进未来网络研究

来源&#xff1a;华为在2021第五届未来网络发展大会上&#xff0c;来自产业界、学术界、研究机构等领域的专家、行业领袖&#xff0c;围绕网络操作系统、6G通信、网络安全、工业互联网等热点话题&#xff0c;共同探讨新型网络技术的攻关与变革。华为董事、战略研究院院长徐文伟…

Windows框架

#include<Windows.h> #include<tchar.h> #include"resource.h" //全局变量 LPSTR g_MainFrame "主框架"; LPSTR g_ClientFrame "客户区框架"; LPSTR g_ChildFrame[] { "子框架1","子框架2" }; LRESULT CALL…