电子商城网站开发平面广告设计素材网
news/
2025/10/5 19:31:19/
文章来源:
电子商城网站开发,平面广告设计素材网,全球最大源码共享网站,深圳市住房和建设局人事调整PTA 排队“夹塞”是引起大家强烈不满的行为#xff0c;但是这种现象时常存在。在银行的单窗口排队问题中#xff0c;假设银行只有1个窗口提供服务#xff0c;所有顾客按到达时间排成一条长龙。当窗口空闲时#xff0c;下一位顾客即去该窗口处理事务。此时如果已知第i位顾客…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 *headNULL,*tail,*p; //本机调试不减65很容易段错误可能是三维数组的特性cinnm;for (int i1;im;i) //输入朋友圈 {int k;cink;for (int j0;jk;j){getchar();scanf(%s,name);record[name[0]-65][name[1]-65][name[2]-65]i;}}double arrive,process,lastendtime0;for (int i0;in;i) //每个人的信息并在输入的过程中查看前面有没有朋友 { //有没有朋友指自己的到达时间比朋友离开的时间要早即下面的判断条件 int flag0; //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-arrivetemp-endscanf(%s%lf%lf,name,arrive,process);if (process60) process60;p(List *)malloc(sizeof(List)); //为朋友节点赋值 p-nextNULL;p-priorNULL;strcpy(p-name,name);p-arrivearrive;p-processprocess;if (i0) //第一个人一定是一来就被处理 {p-startp-arrive;}else //lastendtime是窗口的availiable的时间 {if (p-arrivelastendtime) //到的时间比availiable时间早那么需要等一会一有空就去处理 p-startlastendtime;else //这是窗口有一段空的时间来了就处理同时要注意下边56行对lastendtime的刷新 p-startp-arrive;}p-endp-startp-process; //结束时间 lastendtimep-end; //刷新 p-waitp-start-p-arrive; //计算此人的等待时间 if (p-wait0) p-wait0; //如果等待时间为负那么说明来的比lastendtime晚没等待注实际上53行已考虑了 if (headNULL) //插入 {headp;tailp; //别忘了不然后面的插入会发生段错误 }else{for (List *temptail;temp!NULL;temptemp-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-arrivetemp-end) //temp处是要插入的前一个位置 { //如果二人属性相同并且后来者是赶在朋友走之前来的 flag1; //需要在前面插入 for (List *rrtemp-next;rr!NULL;rrrr-next) //temp是他的朋友在这个人加塞后后面的每个人都要 { //加时长 rr-startp-process;rr-endp-process;rr-waitrr-start-rr-arrive;if (rr-wait0) rr-wait0;}if (temp-nextNULL) //样例中BOB和ANN的情况如果朋友也在最后那么tail要移动到这个人 {tailp;}p-starttemp-end; //朋友的结束就是此人的开始 p-endp-startp-process; //刷新此人的所有信息82-84 p-waitp-start-p-arrive;if (p-wait0) p-wait0;p-nexttemp-next;if (temp-next!NULL) //连接画图理解 temp-next-priorp;p-priortemp;temp-nextp;break;}}if (flag0) //此人没有找到朋友可怜只能尾插 {p-priortail;tail-nextp;tailp;}}}for (List *tthead;tt!NULL;tttt-next) //输出名字 {printf(%s\n,tt-name);}double sum0;for (List *temphead;temp!NULL;temptemp-next) //计算总等待时间 { sumtemp-wait;}printf(%.1lf,sum/n);return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928639.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!