PTA习题:习题8.3 银行排队问题之单窗口“夹塞”版 (30分)——队列

本文探讨了银行单窗口服务中出现的“夹塞”现象,即顾客为朋友代办事务导致等待时间变化的问题。通过建立顾客结构体和队列,模拟了顾客到达、排队、服务及夹塞过程,计算了顾客的平均等待时间。

习题8.3 银行排队问题之单窗口“夹塞”版 (30分)

排队“夹塞”是引起大家强烈不满的行为,但是这种现象时常存在。在银行的单窗口排队问题中,假设银行只有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

这道题我是直接纯用的队列做的。
在《数据结构学习与实验指导》上面看到所有的测试用例:
在这里插入图片描述
想法:
顾客结构体:
struct customer //结构体表示顾客
{
string name; //顾客名字
int time; //顾客事务处理完后的时间结点(也包含了夹塞的朋友的事务处理时间)
int arrive; //顾客达到时间
int wait; //顾客等待时间
int quan; //顾客朋友圈编号
};
首先开辟了2个数组sr和p,sr记录顾客的朋友圈信息,p记录顾客的到达时间和事务处理时间等信息,再将sr中的朋友圈信息逐一对应地拷贝到数组p中。
变量time记录总的等待时间,变量ta记录各个接受服务的顾客处理完自己事务的时间结点(时刻)
某一时刻令队首的顾客到窗口接受服务,同时计算该顾客将要离开窗口的时刻,将输入数据中所有该时刻前到达的顾客全部入列。分别判断队列内和队列外的顾客是否有队首顾客的朋友,若有,则将自己的朋友的事务处理时间累加到队首顾客上。
这里区分已入过队的顾客和从未入队的顾客的方法:在顾客p[i]入队后,将p[i].wait设为0。p[0]到p[N]的顾客中,从未入队的顾客.wait=-1;已入过队的顾客.wait=0。

下面详细阐述一下几个测试点。
测试点0:
最初时刻,JIM、BOB、ANN、AMY均到达入队。JIM处理事务过程中ZOE和JOE也都相继到达,均入队。其中ZOE是JIM的朋友,发生夹塞。JIM处理完弹出,BOB处理事务,ANN和JOE均是BOB的朋友,发生夹塞,最后处理AMY。
在这里插入图片描述
在这里插入图片描述
测试点2:
在这里插入图片描述
在这里插入图片描述
测试点3:
在这里插入图片描述
在这里插入图片描述

C++实现代码(代码挺长了,编也编了很久):

#include<iostream>
#include<string>
using namespace std;
struct customer //结构体表示顾客
{
   
   
	string name; //顾客名字
	int time; //顾客事务处理完后的时间结点(也包含了夹塞的朋友的事务处理时间)
	int arrive; //顾客达到时间
	int wait; //顾客等待时间
	int quan; //顾客朋友圈编号
};
typedef struct customer* Customer;
struct que
{
   
   
	struct customer* name; //顾客队列
	int front, rear;
	int MAXSIZE;
};
typedef struct que* Queue;
Queue CreateQueue(int n)
{
   
   
	Queue Q = new struct que;
	Q->front = Q->rear = -1;
	Q->MAXSIZE = n;
	Q->name = new struct customer[Q->MAXSIZE];
	return Q;
}
void enqueue(Queue Q, struct customer X)
{
   
   
	Q->name[++Q->rear] = X;
}
struct customer dequeue(Queue Q)
{
   
   
	return Q->name[++Q->front];
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值