PAT (Advanced Level) Practice A1014 Waiting in Line (30 分)(C++)(甲级)(队列)

本文介绍了一种基于窗口服务效率的排队系统优化算法,通过动态分配客户到不同窗口,实现排队系统的高效运行。算法考虑了客户等待时间、窗口服务速度及排队长度等因素,旨在减少客户等待时间,提高整体服务质量。

原题链接:A1014 Waiting in Line

#include<algorithm>
#include<iostream>
#include<cstdio>
#include <queue>
using namespace std;

const int MAXC = 10010, MAXW = 22, ONE_HOUR = 60;
typedef struct Customer
{
    int need_time, end_time;//客户需要的时间和被服务结束的时间
}Customer;
typedef struct Windows
{
    int next_time;//该窗口服务完下一个顾客后的时间和服务完最后一个顾客的时间
    int end_time;
}Windows;
int N, M, K, Q;
Customer Cust[MAXC] = {{0}};
queue<int> WinQ[MAXW];//每个窗口排的队
Windows WinT[MAXW];

int main()
{
    scanf("%d %d %d %d", &N, &M, &K, &Q);
    for(int i=1; i<=K; i++)
    {
        scanf("%d", &Cust[i].need_time);
        int tag = 0;
        for(int j=1; j<N; j++)//判断该客户应该进入哪个窗口的队列
        {
            if(WinQ[j].size() < WinQ[tag].size()
               || (WinQ[j].size() == WinQ[tag].size()
                    && WinT[j].next_time < WinT[tag].next_time)) tag = j;
        }
        Cust[i].end_time = WinT[tag].end_time + Cust[i].need_time;//该客户被服务完的时间
        WinQ[tag].push(Cust[i].need_time);//把该客户入队
        WinT[tag].end_time += Cust[i].need_time;//该窗口服务完该客户后的时间
        if((int)WinQ[tag].size() == M)//若该窗口的队列已经排满则服务队前的客户
        {
            WinT[tag].next_time += WinQ[tag].front();
            WinQ[tag].pop();
        }
    }
    for(int i=0, k; i<Q; i++)
    {
        scanf("%d", &k);//若给该客户被服务开始时间大于17点则输出sorry,否则除数被服务结束的时间
        if(Cust[k].end_time-Cust[k].need_time+8*ONE_HOUR >= 17*ONE_HOUR) printf("Sorry\n");
        else printf("%02d:%02d\n", 8+Cust[k].end_time/60, Cust[k].end_time%60);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值