1017. Queueing at Bank (25) - priority_queuet

题目如下:

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

这是一道事件模拟的问题,与前面的排队问题输出业务完成时间不同,本题要求输出每位顾客的等待时间。

我自己没有想到简洁的解决方法,直到看到了sunbaigui的方法。

他的方法核心思路是给每个窗口记录一个时间,代表当前服务的顾客结束的时间,每次取出最早结束服务的窗口,如果等待队列中最前面的顾客到达的时间比这个时间早,说明在等待中,一直要等到服务结束,因此等待时间等于这两个时间的差,此时,窗口的服务结束时间应该被更新为原来的时间(即新顾客开始服务的时间)加上新顾客服务的时间;如果等待队列中最前面的顾客到达时间大于窗口结束服务的时间,说明无需等待,直接服务,这时候窗口的结束服务时间应该被更新为新顾客的到达时间加上服务的持续时间。

为了得到队列最前面的顾客和最早结束服务的窗口,创建两个优先队列,分别管理所有顾客和所有窗口。

STL中的优先队列priority_queue是最大堆容器,默认使用<来比较元素,显然本题目中顾客和窗口的存取规律满足最小堆,因此重载<来实现最小堆。

虽然时间包含时、分、秒,为了简便,都以秒的总和来存储,并且取时间基准为8:00:00对应的秒数28800,因为服务最晚到17:00:01之前,因此取时间上限为61201,在初始化时把所有窗口的服务结束时间设定为28800,也就是说在8:00:00之前到达的顾客需要等待到8:00:00才能接受服务。

为了排除不能服务的人加入平均时间计算,应该在遍历顾客队列时设定一个变量cnt,记录能够被服务的人的数量,在顾客到达时间大于等于时间上限时,及时中断循环避免时间浪费。

#include<iostream>
#include<iomanip>
#include<queue>
#include<stdio.h>

using namespace std;

struct Person{
    int hour;
    int minute;
    int second;
    int last;
    int total;

    Person(int _h, int _m, int _s, int _l) : hour(_h), minute(_m), second(_s), last(_l * 60){
        total = _h * 3600 + _m *60 + _s;
    }

    bool operator < (const Person& p) const {

        if( total > p.total ){
            return true;
        }else{
            return false;
        }

    }

};

struct Window{
    int total;

    Window(int _t):total(_t){}

    bool operator < (const Window& w) const{

        if( total > w.total ){
            return true;
        }else{
            return false;
        }

    }

};

int main(){

    priority_queue<Person> persons;
    priority_queue<Window> windows;

    int N,K;
    cin >> N >> K;

    int clk_base = 28800;
    int clk_limit = 61201;
    int wait_total = 0;

    for(int i = 0; i < K; i++){
        windows.push(Window(clk_base));
    }

    int h,m,s,l;
    for(int i = 0; i < N; i++){
        scanf("%d:%d:%d%d",&h,&m,&s,&l);
        persons.push(Person(h,m,s,l));
    }

    int cnt = 0;
    Person p = Person(0,0,0,0);
    Window w = Window(0);
    while(!persons.empty()){

        p = persons.top();
        persons.pop();
        if(p.total >= clk_limit) break;
        cnt++;
        w = windows.top();
        windows.pop();
        if(p.total < w.total){
            wait_total += w.total - p.total;
            w.total += p.last;
        }else{
            w.total = p.total + p.last;
        }
        windows.push(w);

    }

    printf("%0.1f",wait_total / cnt / 60.0);

    return 0;

}
时间: 2024-08-06 11:39:10

1017. Queueing at Bank (25) - priority_queuet的相关文章

1017 Queueing at Bank (25 分)

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/h

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 ther

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 ther

PAT甲题题解-1017. Queueing at Bank (25)-模拟

有n个客户和k个窗口,给出n个客户的到达时间和需要的时长有空闲的窗口就去办理,没有的话就需要等待,求客户的平均时长.如果在8点前来的,就需要等到8点.如果17点以后来的,则不会被服务,无需考虑. 按客户的到达时间排序建立一个优先级队列,一开始放入k个窗口,初始结束时间为8*3600然后for循环客户,每次从优先级队列中取出最早结束时间的窗口如果客户比结束时间来的早,就需要等待如果客户比结束时间来的晚,就无需等待最后只要统计那些到达时间在17*3600之前的客户即可. #include <iost

pat1017. Queueing at Bank (25)

1017. Queueing at Bank (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue 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 custo

PAT 1017 Queueing at Bank[一般]

1017 Queueing at Bank (25)(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

PAT-甲级-1017. Queueing at Bank【模拟】

1017. Queueing at Bank 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 tur

1017. Queueing at Bank

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 ther

1017 Queueing at Bank (我自己写的模拟时间的版本)

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 ther