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; }
1017. Queueing at Bank (25) - priority_queuet的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- PAT (Advanced Level) 1017. Queueing at Bank (25)
简单模拟. #include<iostream> #include<cstring> #include<cmath> #include<algorithm&g ...
- PAT甲题题解-1017. Queueing at Bank (25)-模拟
有n个客户和k个窗口,给出n个客户的到达时间和需要的时长有空闲的窗口就去办理,没有的话就需要等待,求客户的平均时长.如果在8点前来的,就需要等到8点.如果17点以后来的,则不会被服务,无需考虑. 按客 ...
- 【PAT甲级】1017 Queueing at Bank (25 分)
题意: 输入两个正整数N,K(N<=10000,k<=100)分别表示用户的数量以及银行柜台的数量,接下来N行输入一个字符串(格式为HH:MM:SS)和一个正整数,分别表示一位用户到达银行 ...
- PAT 1017 Queueing at Bank[一般]
1017 Queueing at Bank (25)(25 分)提问 Suppose a bank has K windows open for service. There is a yellow ...
随机推荐
- Maven parent.relativePath
Maven parent.relativePath 默认值为../pom.xml 查找顺序:relativePath元素中的地址–本地仓库–远程仓库 设定一个空值将始终从仓库中获取,不从本地路径获取, ...
- SpringMVC mock测试详解
@RunWith(SpringRunner.class) @SpringBootTest(classes = WebmanagerApplication.class) //配置事务的回滚,对数据库的增 ...
- Tomcat,eclipse热部署的三种方式
热部署是指在你修改项目BUG的时候对JSP或JAVA类进行了修改在不重启WEB服务器前提下能让修改生效.但是对配置文件的修改除外! 怎么说呢?热部署其实用的算少了,热部署怎么说都是个人部署的,大点的公 ...
- Linux的哲学思想
1.一切皆文件:2.单一目的的小程序:3.组合小程序完成复杂任务:4.文本文件保存配置信息:5.尽量避免捕获用户接口:6.提供机制,而非策略. 说到底Linux的哲学思想在于方便和更好的管理后台,不同 ...
- 我在 Ubuntu 下使用 Sublime 编写 python 代码时遇到并解决的问题
Ubuntu 下 Sublime 无法输入中文 解决方法如下: sudo apt-get update && sudo apt-get upgrade 克隆项目到本地 : git cl ...
- zookeeper工作机制
Zookeeper Zookeeper概念简介: Zookeeper是为用户的分布式应用程序提供协调服务的 zookeeper是为别的分布式程序服务的 Zookeeper本身就是一个分布式程序(只要有 ...
- JavaScript正则表达式模式匹配(2)——分组模式匹配
var pattern=/google{4,8}$/; // {4,8}$表示匹配结尾4-8次 var str='googleeeeeeeee'; // 表示e的4-8次 alert(pattern. ...
- Ubuntu搭建owncloud10
前言: 在此我先吐槽一下.用Centos系统简直是为难我自己,是看到那个系统 感到无比的绝望. 正文: 自己在虚拟机中搭建Ubuntu系统.这里就不说了 安装好之后自己换源.建议的源: 清华源: # ...
- IO复制多级目录 控制台输入文件目录然后把目录下java文件复制到 D: 并统计java个数
package cn.itcast_05; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor ...
- [Java笔记]继承
继承只是继承框架,而数据没有继承!. 继承不改变父类数据!