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

原题链接:A1014 Waiting in Line

#include
#include
#include
#include 
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;
}



你可能感兴趣的:(PAT甲级刷题笔记)