1017 Queueing at Bank

Posted kkmjy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1017 Queueing at Bank相关的知识,希望对你有一定的参考价值。

题意:银行有K个窗口用于服务,给出所有人的达到时间T和服务时间P,计算所有被服务的客户的平均等待时间。任何客户的服务时间不得超过60分钟。早于08:00到的,要等到08:00;在17:00:01及之后到的,不给予服务,不参与计算平均等待时间。

思路:首先,对所有顾客的到达时间进行排序;其次,令数组windows[i]表示窗口i当前顾客的结束服务的时间,初始化为08:00,这样的话,每次要安排下一个顾客前往某窗口接受服务时,就遍历所有窗口,找出当前最快结束的那个窗口(记为minidx),然后让这位顾客去minidx号窗口接受服务。顾客的等待时间分为两种情况:1)若顾客到达的时间比较早,早于当前窗口的最早结束的时间,如当前窗口结束前一个人的服务时间是08:16,但是下一位顾客08:01(其服务时间是60分钟)就到了,则该顾客需等待15分钟,而该窗口的最早结束服务的时间就更新为08:16+60min;2)若顾客到达的时间比较晚,晚于当前窗口的最早结束的时间,如当前窗口结束前一个人的服务时间是08:16,但是下一位顾客08:20(其服务时间是60分钟)才到,则该顾客无需等待,相应的,该窗口的最早结束服务的时间就更新为08:20+60min,注意区别,这种情况下,时间更新为该顾客的到达时间+其服务时长!

一些注意点:

1.为了时间比较的方便,统一化成以秒为单位;

2.因为任何客户的服务时间不得超过60分钟,故在数据输入时就先做好判断,如果某个顾客服务时间超过60分钟的,直接截断成60分钟;

3.因为在17:00:01及之后到的,不给予服务,不参与计算平均等待时间,即无效数据,故在数据输入时就先剔除;

我的主要问题出在了更新状态未考虑周全,即上面所说的情况(2)。

代码:

#include <cstdio>
#include <algorithm>
using namespace std;
const int START_TIME=8*3600;
const int END_TIME=17*3600;
//时间均以秒为单位
struct Customer{
    int arrivedTime;
    int servedTime;
}cus[10005];
int totalWait=0;//总的等待时间
int windows[105];//表示窗口i的最早结束服务的时间,初始化为START_TIME

bool cmp(Customer a,Customer b){
    return a.arrivedTime<b.arrivedTime;
}

int main()
{
    //freopen("pat.txt","r",stdin);
    fill(windows,windows+105,START_TIME);//初始化
    int n,k,validCnt=0;
    scanf("%d%d",&n,&k);
    int hh,mm,ss,serve;
    for(int i=0;i<n;i++){
        scanf("%d:%d:%d%d",&hh,&mm,&ss,&serve);
        if(hh*3600+mm*60+ss>END_TIME) continue;//如果到达时间超过下班时间,则无效
        cus[validCnt].arrivedTime=hh*3600+mm*60+ss;
        cus[validCnt++].servedTime=(serve>60?60:serve)*60;
    }
    sort(cus,cus+validCnt,cmp);
    int idx=0;
    while(idx<validCnt){
        //遍历所有窗口,寻找当前哪个窗口最先有空
        int minidx=-1,minTime=0x7fffffff;
        for(int i=0;i<k;i++){
            if(windows[i]<minTime){
                minTime=windows[i];
                minidx=i;
            }
        }
     //更新
if(windows[minidx]>cus[idx].arrivedTime){ totalWait+=windows[minidx]-cus[idx].arrivedTime; windows[minidx]+=cus[idx].servedTime; }else{ windows[minidx]=cus[idx].arrivedTime+cus[idx].servedTime;//关键,容易忽略 } idx++; } printf("%.1f",totalWait/60.0/validCnt); return 0; }

 


以上是关于1017 Queueing at Bank的主要内容,如果未能解决你的问题,请参考以下文章

PAT1017:Queueing at Bank

1017. Queueing at Bank (25)

PAT 1017. Queueing at Bank

1017 Queueing at Bank

PAT 1017 Queueing at Bank

1017 Queueing at Bank (25 分)