PAT 1017 Queueing at Bank (25)

Suppose a bank has K windows open for service. There is a yellow line in front of the windows which devides the waiting area into two parts. All the customers have to wait in line behind the yellow line, until it is his/her turn to be served and there is a window available. It is assumed that no window can be occupied by a single customer for more than 1 hour.

Now given the arriving time T and the processing time P of each customer, you are supposed to tell the average waiting time of all the customers.

Input Specification:

Each input file contains one test case. For each case, the first line contains 2 numbers: N (<=10000) - the total number of customers, and K (<=100) - the number of windows. Then N lines follow, each contains 2 times: HH:MM:SS - the arriving time, and P - the processing time in minutes of a customer. Here HH is in the range [00, 23], MM and SS are both in [00, 59]. It is assumed that no two customers arrives at the same time.

Notice that the bank opens from 08:00 to 17:00. Anyone arrives early will have to wait in line till 08:00, and anyone comes too late (at or after 17:00:01) will not be served nor counted into the average.

Output Specification:

For each test case, print in one line the average waiting time of all the customers, in minutes and accurate up to 1 decimal place.

Sample Input:
7 3
07:55:00 16
17:00:01 2
07:59:59 15
08:01:00 60
08:00:00 30
08:00:02 2
08:03:00 10
Sample Output:
8.2
这道题跟1014很相似,也是排队问题,我定义了两个结构体,
一个是人的,一个窗口的,一开始我是直接把小时分钟秒存进去,
到后面发现比较时间前后容易,但是计算等待时间太复杂了,
看了网上很多人都是把时间用秒表示,所以我修改了代码,把时间换算成用秒表
示,这样计算等待时间比较容易了。
我的思路是对人的到达先后顺序排序,先处理每个窗口来的第一个人,每个窗口
都有一个服务时长,之后对后面的人,都选择一个最先服务完的窗口,于是我在
每个人服务之前,都对窗口的服务时长进行排序,很幸运没发生栈溢出.....
题目的第二个测试点要考虑人比窗口数少的情况。
#include <iostream>
#include <cstdio>
#include <string>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
struct people{
    int second;
    int process_time;
    people(int s, int pro):second(s),process_time(pro){}
    bool operator<(struct people b)
    {
        if(second < b.second)
          return true;
        return false;
    }
};
struct Stime{
    int second;
    bool operator<(Stime b)
    {
       if(second < b.second)
          return true;
        return false;
    }
};
int main()
{
    int N,K,n = 0;
    cin>>N>>K;
    vector<people> que;
    vector<Stime> win_serve(K);
    int h,m,s;
    int pro;
    double tot_wait_time = 0;
    for(int i = 0; i < N; i++)
    {
        scanf("%d:%d:%d %d",&h,&m,&s,&pro);
        int second = h * 3600 + m * 60 + s;
        if(second <= 17 * 3600)
        {
          que.push_back(people(second,pro));
          n++;
        }
    }
    sort(que.begin(),que.end());
    for(int i = 0; i < min(K,n); i++) //考虑人少的情况
    {
        if(que[i].second < 8 * 3600)
        {
           win_serve[i].second = 8 * 3600 + que[i].process_time * 60;
           tot_wait_time += 8 * 3600 - que[i].second;
        }
        else
        {
           win_serve[i].second = que[i].second + que[i].process_time * 60;
        }
    }
    for(int i = K; i < n; i++) //是n,不是N
    {
        sort(win_serve.begin(),win_serve.end());
        if(win_serve[0].second >= que[i].second)
        {
            tot_wait_time += win_serve[0].second - que[i].second;
            win_serve[0].second += que[i].process_time * 60;
        }
        else
            win_serve[0].second = que[i].second + que[i].process_time * 60;
    }
    printf("%.1lf\n",tot_wait_time * 1.0 / (60 * n));
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值