PAT 1017. Queueing at Bank

来源:互联网 发布:红帽linux是什么 编辑:程序博客网 时间:2024/05/01 21:54

【题目链接】

这道题比1014要简单,但是最后一个case始终过不了,暂时记载在这篇博文上。思路和1014差不多,只不过这题所有的人都站在了黄线外等待,只有窗口空闲才去该窗口获取服务。需要注意的有以下几点:

1、客户只要在17点01分之前到达,就一定有窗口对此客户服务到底,也就是说他开始接受服务的时间可以在17点01分及之后的时间。

2、当有窗口空闲,但是下一位顾客还未到来时,窗口需要等待。

3、若全部顾客在17点之后到达,则输出“0.0”。

代码如下:

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int n, k;int leaveTime[10005];int waitTime[10005];int window[105]; //存放对应窗口当前服务的客户编号struct Customer{    int arriveTime;    int processTime;}buf[10005];bool cmp(Customer a, Customer b){    return a.arriveTime < b.arriveTime;}int main(){    //freopen("in_1017.txt", "r", stdin);    int hour, minute, second;    cin >> n >> k;    for(int i = 0; i < n; i++)    {        cin >> hour;        getchar();        cin >> minute;        getchar();        cin >> second >> buf[i].processTime;        buf[i].processTime *= 60;        buf[i].arriveTime = hour * 3600 + minute * 60 + second;    }    sort(buf, buf + n, cmp);    int cus;    int num = 0; //在17点之后到达的顾客数量    for(int i = 0; i < k && i < n; i++)    {        cus = i;        window[i] = i;        if(buf[i].arriveTime < 8 * 3600)        {            leaveTime[i] = 8 * 3600 +  buf[i].processTime;            waitTime[i] = 8 * 3600 - buf[i].arriveTime;        }        else if(buf[i].arriveTime <= 17 * 3600)        {            leaveTime[i] = buf[i].arriveTime +  buf[i].processTime;            waitTime[i] = 0;        }        else        {            waitTime[i] = -1;            num++;            continue;        }    }    int min_leave; //最早的离开时间    int min_win; //每次离开的客户对应的窗口序号    for(int i = cus + 1; i < n; i++)    {        if(buf[i].arriveTime > 17 * 3600)        {            waitTime[i] = -1;            num++;            continue;        }        min_leave = 18 * 3600 + 1;        for(int j = 0; j < k; j++)        {            int u = window[j]; //u保存当前窗口服务的客户编号            if(leaveTime[u] < min_leave)            {                min_leave = leaveTime[u];                cus = u;                min_win = j;            }        }        window[min_win] = i;        //当有窗口空闲, 但是下一位顾客还未到来时, 窗口需要等待;        if(leaveTime[cus] < buf[i].arriveTime) leaveTime[cus] = buf[i].arriveTime;        waitTime[i] = leaveTime[cus] - buf[i].arriveTime;        leaveTime[i] = leaveTime[cus] +  buf[i].processTime;    }    double average = 0;    for(int i = 0; i < n; i++)        if(waitTime[i] >= 0) average += waitTime[i];        else break;    if(n != num) //若全部顾客在17点之后到达,下面语句分母为0    printf("%.1lf\n", average / 60 / (n - num));    else printf("0.0\n");}


0 0
原创粉丝点击