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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44056753/article/details/102536630

假设银行有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

按照题意简单模拟,注意处理时间不会超过60这个条件

#include<iostream>
#include<string>
#include<stack>
#include<vector>
#include<cstdio>
#include<cstring>
#include<map>
#include<queue>
#include<algorithm>
#include<iomanip>
using namespace std;
const int INF=0xfffffff;
struct peo
{
    int l,r;
};
int in[10],num[10];
peo per[1000];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>per[i].l>>per[i].r;
        if(per[i].r>60)
            per[i].r=60;
    }
    int k;
    cin>>k;
    fill(in,in+k,0);
    fill(num,num+k,0);
    int all_time=0,max_time=0,min_time=INF,min_i=0;
    for(int i=0;i<n;i++)
    {
        min_time=INF;
        bool flag=false;
        for(int j=0;j<k;j++)
        {
            if(min_time>in[j])
            {
                min_time=in[j];
                min_i=j;
            }
            if(in[j]<=per[i].l)
            {
                in[j]=per[i].l;
                in[j]+=per[i].r;
                num[j]++;
                flag=true;
                break;
            }
        }
        if(!flag)
        {
            int p=min_time-per[i].l;
            all_time+=p;
            max_time=max(max_time,p);
            in[min_i]+=per[i].r;
            num[min_i]++;
        }
    }
    sort(in,in+k,greater<int>());
    cout<<setprecision(1)<<fixed<<double(all_time)/((double)n)<<" "<<max_time<<" "<<in[0]<<endl;
    for(int i=0;i<k;i++)
    {
        if(i==0)
            cout<<num[i];
        else
            cout<<" "<<num[i];
    }
    cout<<endl;
}


猜你喜欢

转载自blog.csdn.net/weixin_44056753/article/details/102536630
今日推荐