题目如下:

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; }

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

  1. PAT 甲级 1017 Queueing at Bank (25 分)(模拟题,有点思维小技巧,第二次做才理清思路)

    1017 Queueing at Bank (25 分)   Suppose a bank has K windows open for service. There is a yellow line ...

  2. 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 ...

  3. 1017 Queueing at Bank (25)(25 point(s))

    problem Suppose a bank has K windows open for service. There is a yellow line in front of the window ...

  4. 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 ...

  5. 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 ...

  6. PAT (Advanced Level) 1017. Queueing at Bank (25)

    简单模拟. #include<iostream> #include<cstring> #include<cmath> #include<algorithm&g ...

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

    有n个客户和k个窗口,给出n个客户的到达时间和需要的时长有空闲的窗口就去办理,没有的话就需要等待,求客户的平均时长.如果在8点前来的,就需要等到8点.如果17点以后来的,则不会被服务,无需考虑. 按客 ...

  8. 【PAT甲级】1017 Queueing at Bank (25 分)

    题意: 输入两个正整数N,K(N<=10000,k<=100)分别表示用户的数量以及银行柜台的数量,接下来N行输入一个字符串(格式为HH:MM:SS)和一个正整数,分别表示一位用户到达银行 ...

  9. PAT 1017 Queueing at Bank[一般]

    1017 Queueing at Bank (25)(25 分)提问 Suppose a bank has K windows open for service. There is a yellow ...

随机推荐

  1. SpringMVC中url-pattern /和/*的区别

    http://blog.csdn.net/u010648555/article/details/51612030

  2. hibernate实体对象的三种状态:自由状态,持久状态,游离状态.

    自由态与游离态的区别: 当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它 对应的记录,只是现在这个游离对 ...

  3. Python中什么是变量Python中定义字符串

    在Python中,变量的概念基本上和初中代数的方程变量是一致的. 例如,对于方程式 y=x*x ,x就是变量.当x=2时,计算结果是,当x=5时,计算结果是25. 只是在计算机程序中,变量不仅可以是数 ...

  4. 智能指针之 unique_ptr

    对于动态申请的内存,C++语言为我们提供了new和delete运算符, 而没有像java一样,提供一个完整的GC机制,因此对于我们申请的动态内存, 我们需要时刻记得释放,且不能重复释放,释放后不能再去 ...

  5. python:浅析python 中__name__ = '__main__' 的作用(转载)

    每次看文章的源码时,Python的主程序中都会看到开头有这个,查了一下作用:https://www.cnblogs.com/alan-babyblog/p/5147770.html. 讲的很详细,就直 ...

  6. Linux下的有用命令

    在之前的博客<Linux下常用命令与使用技巧>中,介绍了Linux的常用命令,在今天的博客中,给大家介绍其他的有用命令. 1.文本转换命令 在Linux下工作,我们不可避免地要和文件格式做 ...

  7. OWASP Top 10十大风险 – 10个最重大的Web应用风险与攻防

    先来看几个出现安全问题的例子 OWASP TOP10 开发为什么要知道OWASP TOP10 TOP1-注入 TOP1-注入的示例 TOP1-注入的防范 TOP1-使用ESAPI(https://gi ...

  8. xlwt以格式生成xls文件

    参考: http://blog.sina.com.cn/s/blog_5357c0af01019gjo.html http://www.programcreek.com/python/example/ ...

  9. mysql 跨服务器复制数据库

    比较了下,还是采用ssh的方式最简单.比如传数据库test_db mysqldump --databases test_db| ssh 121.121.121.121 test_db

  10. myeclipse中修改maven的默认仓库位置

     1.本地需要安装Maven.这里假设安装在D:\Program Files\apache-maven-2.2.1       2.修改本地maven库的路径:在D:\Program Files\ap ...