银行排队问题之单队列多窗口加VIP服务

假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。

有些银行会给VIP客户以各种优惠服务,例如专门开辟VIP窗口。为了最大限度地利用资源,VIP窗口的服务机制定义为:当队列中没有VIP客户时,该窗口为普通顾客服务;当该窗口空闲并且队列中有VIP客户在等待时,排在最前面的VIP客户享受该窗口的服务。同时,当轮到某VIP客户出列时,若VIP窗口非空,该客户可以选择空闲的普通窗口;否则一定选择VIP窗口。

本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统计每个窗口服务了多少名顾客。

输入格式:

输入第1行给出正整数N(≤1000),为顾客总人数;随后N行,每行给出一位顾客的到达时间T、事务处理时间P和是否VIP的标志(1是VIP,0则不是),并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤10)—— 为开设的营业窗口数,以及VIP窗口的编号(从0到K−1)。这里假设每位顾客事务被处理的最长时间为60分钟。

输出格式:

在第一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。

在第二行中按编号递增顺序输出每个窗口服务了多少名顾客,数字之间用1个空格分隔,行末不能有多余空格。

输入样例:

10
0 20 0
0 20 0
1 68 1
1 12 1
2 15 0
2 10 0
3 15 1
10 12 1
30 15 0
62 5 1
3 1

输出样例:

15.1 35 67
4 5 1

代码

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
class People{      //客户
	public:
		People(){
			arrive = 0;
			time = 0;
			vip = 0;
			use = 0;
		}
	public:
		int arrive;
		int time;
		int vip;
		int use;  //该客户是否已被操作
};
People p[10000];
int win[20];      //每个窗口的最后结束时间
int k;
int t = 0;
int VIP;          //VIP窗口
int sum[20] = {0};//每个窗口的客户人数
int wait[10000];  //每个让客户的等待时间
int flag = 0;     //队列中VIP存在的数目
queue<int> pos;  //存放队列中VIP的下标
int getmin(){
	int min = win[0];
	int key = 0;
	for(int i = 0;i < k;i++)
	{
		if(min > win[i]){
			key = i;
			min = win[i];
		}
	}
	return key;
}
int getmax(){
	int max = 0;
	for(int i = 0;i < k;i++){
		if(max < win[i])max = win[i];
	}
	return max;
}
int main(){
	int n,j,i;
	cin>>n;
	int min = 0;
	int num = n;
	int tail = 0;  //对所有人操作的头索引
	int head = 0;  //对所有人操作入队的尾索引
	for(i = 0;i < n;i++){
		cin>>p[i].arrive>>p[i].time>>p[i].vip;
		if(p[i].time > 60)p[i].time = 60;
	}
	cin>>k>>VIP;
	if(n != 0)
	while(num){
		int key = getmin();
		while(tail <= n){   //根据从最早结束的窗口的时间和客户到达的时间进行入队
			while(p[tail].use == 1 && tail <= n)tail++;
			if(p[tail].arrive < win[key] && tail <= n){
				if(p[tail].vip == 1){
					flag++;
					pos.push(tail);
				}
				tail++;
			}
			else break;
		}
		while(p[head].use == 1)head++;  //对已操作的客户进行过滤
		if(head == tail){    //头索引 == 尾索引表明此时队列为空,下一个客户直接插入
			for(j = 0;j < k;j++)
			if(win[j] <= p[head].arrive)break;
		    if(p[head].vip == 1 && p[head].arrive >= win[VIP] && flag == 0)j = VIP;
			win[j] = p[head].arrive + p[head].time;
			sum[j]++;
			p[head].use = 1;
			head++;
			tail++;
			num--;
		    continue;
		}
		else{
			if((key == VIP && flag > 0 )|| (win[key] == win[VIP] && flag > 0)){  //当VIP窗口闲置且队伍中存在VIP时对VIP的安排
				int k = pos.front();
				pos.pop();
				wait[k] += (win[VIP] - p[k].arrive);
				if(wait[k] > min)min = wait[k];
 
				win[VIP] += p[k].time;
				sum[VIP]++;
				p[k].use = 1;
				flag--;
				num--;
			}
			else{   //当不满足VIP安排时,正常的对队首的安排,此时安排无关是否为VIP.
					wait[head] += (win[key] - p[head].arrive);
					if(wait[head] > min)min = wait[head];
				    win[key] += p[head].time;
				    p[head].use = 1;
				    if(p[head].vip == 1 && flag > 0){   //若是VIP需将从pos的VIP下标队列中删除
				    	flag--;
				    	pos.pop();
				    }
				    sum[key]++;
				    head++;
				    num--;
			}
		}
 
	}  //格式化输出
	if(n == 0){
		cout<<"0.0 0 0"<<endl;
	}
	else{
 
		for(i = 0;i < n;i++)
		t += wait[i];
		double avg = (double)(1.0 * t / n);
	    printf("%.1lf " , avg);
	    cout<<min<<" ";
	    int max_time = getmax();
	    cout<<max_time<<endl;
	}
	for(i = 0;i < k;i++)
	if(i == 0)cout<<sum[i];
	else cout<<" "<<sum[i];
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 单队列多窗口VIP服务是一种银行排队管理方式,它解决了在银行排队时的等待问题。在这种方式中,顾客只需排在一个队列中,但有多个窗口可供办理业务。VIP客户可以使用专门VIP窗口进行服务。这样可以有效地减少顾客的等待时间,提高服务效率。 ### 回答2: 在银行的日常营运中,排队问题一直是一个非常棘手的问题。为了解决排队问题,现在许多银行采取单队列多窗口vip服务的模式来服务客户。这种模式的主要优点在于: 1. 窗口数量增多:采用多窗口服务客户可以选择任意一个窗口进行业务办理,因此客户办理业务的速度大大增,等待时间减少。 2. 排队相对公平:单队列可以让每个客户都先后按照时间顺序进入等待状态,从而避免了“抢号”、“肘挤肘”等问题。 3. VIP服务:针对忙碌的客户和要办理复杂业务的客户银行可以提供VIP服务,使排队问题得到进一步缓解,提高了银行服务品质。 总的来说,采用单队列多窗口vip服务的方式可以从客户的角度出发,解决排队问题,提高客户体验;从银行的角度出发,优化窗口利用,提高业务量。如果一家银行能够善用这种服务模式,相信在服务质量和经济效益方面都获得不错的收益。 ### 回答3: 银行排队问题是一个常见的实际问题,在每个银行的营业厅内经常看到顾客排队等待办理业务的场景。为了解决银行排队问题银行经常采用单队列多窗口VIP服务的方式。 单队列多窗口的方式是指在银行的营业厅内,设置一个单独的队列,所有需要办理业务的顾客都需要先排在该队列中,而不是在各个柜台前各自排队。在该队列前设置多个窗口,每个窗口都可以为队列中的顾客提供服务。这样做可以有效避免因为某一个柜台办理业务时间过长而导致其他的顾客需要等待过久的时间。 在单队列多窗口的基础上,部分银行增设VIP服务VIP服务是指为了提升银行高端客户的体验而设置的一种服务。顾客可以通过一定条件获得VIP服务,如拥有高额存款等。银行专门VIP客户设置一些额外的窗口,以便为其提供更为优质的服务。在单队列多窗口结构中,VIP窗口可以与普通窗口一样为VIP客户服务,使得其等待时间更短。 采用单队列多窗口VIP服务有以下优点: 一、可以平衡各窗口的负荷,降低普通柜员的工作压力。 二、可以减少客户等待时间,提升服务效率。 三、增设VIP服务可以提升高端客户的体验,同时也能带来实质性的业务贡献。 综上所述,采用单队列多窗口VIP服务是解决银行排队问题的一种有效方案,可以为银行提升服务质量、减少客户等待时间、提升客户满意度、实现营业效益的多重目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值