DS队列----银行单队列多窗口模拟
Posted szu-ds-wys
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DS队列----银行单队列多窗口模拟相关的知识,希望对你有一定的参考价值。
题目描述
假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。
本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间。
输入
输入第1行给出正整数N(≤),为顾客总人数;随后N行,每行给出一位顾客的到达时间T
和事务处理时间P
,并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤),为开设的营业窗口数。
输出
在一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。
样例输入
9 0 20 1 15 1 61 2 10 10 5 10 3 30 18 31 25 31 2 3
样例输出
6.2 17 62
提示
#include<iostream> #include<queue> #include<iomanip> using namespace std; int queindex(int total,queue<int>Q) { int index=0; queue<int>temp=Q; while(!temp.empty()) { temp.pop(); index++; } return total-index+1; } int main() { int virclock=0; double averagewait=0; int maxwait=0; int alreadytime=0; queue<int>arrivetime;///客户到的时间 queue<int>solvetime;///办业务的时间 int T; cin>>T; int timewait[T];///各个客户等待的时间,各项初始化为0 for(int i=0;i<T;i++) timewait[i]=0; for(int i=0;i<T;i++) { int n,t; cin>>n>>t; arrivetime.push(n); solvetime.push(t); } int K; cin>>K; queue<int>bank[K]; int done=0; while(done==0) { for(int i=0;i<K;i++) { if(bank[i].empty())///银行有空位 { if(!arrivetime.empty()&&arrivetime.front()<=virclock)///有人到银行 { bank[i].push(solvetime.front()); arrivetime.pop(); solvetime.pop(); } } } int bankemp=0;///银行还有几个空位,当空位为0时判断一下是否还有人在等待 for(int i=0;i<K;i++) if(bank[i].empty()) bankemp++; if(bankemp==0) { queue<int>temp=arrivetime; while(!temp.empty()&&temp.front()<=virclock)///如果有人等,找他是第几个客户,数组等待时间加 { int number=queindex(T,temp); timewait[number-1]+=1; temp.pop(); } } for(int i=0;i<K;i++)///该分钟的处理 { if(!bank[i].empty()) { int temp=bank[i].front()-1; bank[i].pop(); bank[i].push(temp); if(bank[i].front()==0) { bank[i].pop(); } } } int emp=1;///判断是否完全结束 for(int i=0;i<K;i++) { if(!bank[i].empty()) { emp=0; break; } } if(emp==1&&arrivetime.empty()&&solvetime.empty()) done=1; virclock++;///进入下一分钟 } for(int i=0;i<T;i++)///分别计算平均等待时间与最大等待时间 { if(maxwait<timewait[i]) maxwait=timewait[i]; averagewait+=timewait[i]; } averagewait/=T; alreadytime=virclock; cout<<fixed<<setprecision(1)<<averagewait<<" "; cout<<maxwait<<" "; cout<<alreadytime<<endl; return 0; }
以上是关于DS队列----银行单队列多窗口模拟的主要内容,如果未能解决你的问题,请参考以下文章