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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PTA 银行排队问题之单队列多窗口服务相关的知识,希望对你有一定的参考价值。

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

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

输入格式:

输入第1行给出正整数N(≤),为顾客总人数;随后N行,每行给出一位顾客的到达时间T和事务处理时间P,并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤),为开设的营业窗口数。这里假设每位顾客事务被处理的最长时间为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;
const int maxn = 10100;
typedef long long LL;
struct node
{
    int arrive;
    int cost;
}p[maxn];
int server[20]={0};
int Per[20]={0};
int n,k;
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&p[i].arrive,&p[i].cost);
        p[i].cost = p[i].cost > 60?60:p[i].cost;
    }
    scanf("%d",&k);
    memset(Per,0,sizeof(Per));
    LL waittime = 0;
    int longwaittime = 0;
    memset(server,0,sizeof(server));
    for(int i=0;i<n;i++)
    {

        int serverid=0;
        for(int j=0;j<k;j++)
        {
            if(server[j]<=p[i].arrive)
            {
                serverid = j;
                break;
            }
            else
            {
                //这个等号卡了我好久
                serverid = server[serverid]<=server[j]?serverid:j;
            }
        }
        if(server[serverid] > p[i].arrive)
        {
            waittime+=(server[serverid]-p[i].arrive);
            longwaittime = max(longwaittime,server[serverid]-p[i].arrive);
            server[serverid] = server[serverid] + p[i].cost;
        }
        else
        {
            server[serverid] = p[i].arrive+p[i].cost;
        }
        Per[serverid]++;
    }
    //的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统计每个窗口服务了多少名顾客。
    double avewait = (waittime*1.0)/(n*1.0);
    int finishtime = *max_element(server,server+k);
    printf("%.1lf %d %d\n",avewait,longwaittime,finishtime);
    for(int i=0;i<k;i++)
        printf("%d%c",Per[i],i==k-1?‘\n‘:‘ ‘);
}

  

以上是关于PTA 银行排队问题之单队列多窗口服务的主要内容,如果未能解决你的问题,请参考以下文章

博客作业03--栈和队列

用队列管理解决食客的排队问题

7-48 银行排队问题之单窗口“夹塞”版 (30分)--map,vector

DS队列之银行排队

数据结构 队列

求解C++模拟银行排队问题