您的位置:首页 > 其它

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

2017-10-23 10:28 543 查看


7-1 银行排队问题之单队列多窗口服务(25 分)

假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。
本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统计每个窗口服务了多少名顾客。


输入格式:

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


输出格式:

在第一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用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 61
5 3 1


#include<bits/stdc++.h>
using namespace std;
typedef struct//顾客自己记录到达时间,处理事务需要的时间和等待的时间
{
    int T;
    int P;
    int waittime;
} SqCustomer;
typedef struct//窗口记录到本窗口处理事务的顾客的人数和处理完的时间
{
    int num;
    int endtime;
    //int handletime;
} SqWindow;
int main()
{
    int N,K;
    int t,p;
    int MaxTime=0;
    int SumTime=0;
    int FinTime=0;
    cin>>N;
    SqCustomer Pep
;
    for(int i=0; i<N; i++)
    {
        Pep[i].waittime=0;
        cin>>t>>p;
        Pep[i].T=t;
        if(p>60)
        {
            p=60;
        }
        Pep[i].P=p;
    }//初始化人到达的时间和事务处理时间并且处理时间初始化为0
    cin>>K;
    SqWindow Windows[K];//初始化出口数并将窗口服务的人初始化为0,结束时间为0,
    for(int i=0; i<K; i++)
    {
        Windows[i].num=0;
        Windows[i].endtime=0;
        //Windows[i].handletime=0;
    }
    if(K>=N)//窗口数大于等于人数,每个窗口一个顾客
    {
        for(int i=0; i<N; i++)
        {
            Pep[i].waittime=0;
            Windows[i].endtime=Pep[i].T+Pep[i].P;
            Windows[i].num++;
        }
    }
    else
    {
        int temptime=0;
        Windows[0].num=1;
        Windows[0].endtime=Pep[0].T+Pep[0].P;
        for(int i=1; i<N; i++)
        {
            int flag=0;
            int flag1=0;
            for(int j=0; j<K; j++)
            {
                if(Windows[flag].endtime>Windows[j].endtime)
                {
                    flag=j;//记录有最小结束时间的窗口序号
                }
                if(Pep[i].T>=Windows[j].endtime)
                {
                    flag1=j;
                    break;
                }
            }
            if(Pep[i].T>=Windows[flag].endtime)
            {
                Windows[flag].num++;
                Windows[flag].endtime=Pep[i].T+Pep[i].P;
                Pep[i].waittime=0;
            }
            else
            {
                Pep[i].waittime=Windows[flag].endtime-Pep[i].T;
                Windows[flag].endtime+=Pep[i].P;
                Windows[flag].num++;
            }
        }
    }
    for(int i=0; i<N; i++)//求最长的等待时间和总的等待时间
    {
        if(Pep[i].waittime>MaxTime)
        {
            MaxTime=Pep[i].waittime;
        }
        SumTime+=Pep[i].waittime;
    }
    double AveTime;
    AveTime=(1.0*SumTime)/(1.0*N);
    for(int i=0; i<K; i++)//所有窗口中最大的endtime为最后处理完成的时间
    {
        if(Windows[i].endtime>FinTime)
        {
            FinTime=Windows[i].endtime;
        }
    }
    cout<<fixed<<setprecision(1)<<AveTime<<" ";//按要求输出
    cout<<MaxTime<<" "<<FinTime<<endl;
    for(int i=0; i<K; i++)
    {
        if(i<K-1)
            cout<<Windows[i].num<<" ";
        if(i==K-1)
            cout<<Windows[i].num;
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: