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队列----银行单队列多窗口模拟的主要内容,如果未能解决你的问题,请参考以下文章

数据结构 队列

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

DS队列----银行简单模拟

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

DS队列之银行排队

博客作业03--栈和队列