PAT (Advanced) 1014. Waiting in Line (30)

来源:互联网 发布:中国云计算用户大会 编辑:程序博客网 时间:2024/06/06 10:06

原题:1014. Waiting in Line (30)



解题思路:

1.可以确定一个顾客在加入队伍时,服务结束的时间就已经决定。

2.顾客是按顺序到达,但是没有时间间隔,所以只要有窗口前队伍未满,就会加入。

3.由此可以将顾客分为两类,第一类是在窗口全满前到达,第二类是在之后到达的。

4.第一类直接加入队伍,并刷新队伍最后一个人结束的时间,借此获取每个顾客的结束时间。

5.第二类寻找队伍中第一个顾客最早结束的队伍,并加入,其余操作同4。

注:可使用队列模拟队伍。


C++代码如下:

#include<cstdio>#include<queue>#include<algorithm>using namespace std;const int maxn = 1010;struct window{    int firstTime; //第一个顾客结束的时间    int lastTime;   //最后一个顾客结束的时间    queue<int> Q; //队伍:保存每个顾客的服务时间} win[21];struct customer{    int finishTime; //保存结束时间    int serveTime;  //保存服务时间} cus[maxn];int main(){    int n, m, query, k;    while(scanf("%d%d%d%d", &n, &m, &k, &query) != EOF)    {        for(int i = 0; i < k; i++)        {            int t;            scanf("%d", &t);            cus[i].serveTime = t;        }        //初始化每个窗口到8:00        for(int i = 0; i < n; i++)        {            win[i].firstTime = 8 * 60;            win[i].lastTime = 8 * 60;        }        int index = 0;        for(; index < min(m * n, k); index++) //先处理前 n*m 个顾客,注意与k比较大小        {            //入队            win[index % n].Q.push(cus[index].serveTime);            //更新队伍结束时间以及顾客服务结束时间            cus[index].finishTime = win[index % n].lastTime + cus[index].serveTime;            win[index % n].lastTime = cus[index].finishTime;        }        for(; index < k; index++)        {            //寻找第一个顾客结束最早的队伍            int u = -1, MIN = 21 * 3600;            for(int i = 0; i < n; i++)            {                if(MIN > win[i].firstTime + win[i].Q.front())                {                    u = i;                    MIN = win[i].firstTime + win[i].Q.front();                }            }            //更新队列信息以及获取顾客服务结束时间            win[u].firstTime = win[u].firstTime + win[u].Q.front();            win[u].Q.pop();            win[u].Q.push(cus[index].serveTime);            win[u].lastTime = win[u].lastTime + cus[index].serveTime;            cus[index].finishTime = win[u].lastTime;        }        for(int i = 0; i < query; i++)        {            int q;            scanf("%d", &q);            if(cus[q - 1].finishTime - cus[q - 1].serveTime >= 17 * 60) // 服务开始时间超过 17:00 (含17:00)不予服务                printf("Sorry\n");            else                printf("%02d:%02d\n", cus[q - 1].finishTime / 60, cus[q - 1].finishTime % 60);        }    }    return 0;}