PAT 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 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
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; int N,K,wait_time=;
struct Customer
{
int arrive_time;
int need_time;
}; struct Customer customer[]; struct Windows
{
int next_available_time;
}; struct Windows windows[]; bool cmp(struct Customer a,struct Customer b)
{
return a.arrive_time<b.arrive_time;
} int find_available_windows(int arrive_time)
{
int i;
for(i=;i<K;i++) {
if(windows[i].next_available_time<=arrive_time) {
return i;
}
}
return -;
} int find_earliest_window()
{
int i;
int e=;
for(i=;i<K;i++) {
if(windows[i].next_available_time<windows[e].next_available_time) {
e=i;
}
}
return e;
} int main()
{
scanf("%d%d",&N,&K);
int i;
char arrive_time[];
int need_time;
for(i=;i<K;i++)
windows[i].next_available_time=*;
int len=;
for(i=;i<N;i++) {
int h,m,s;
scanf("%s%d",arrive_time,&need_time);
if(strcmp(arrive_time,"17:00:00")>)
continue; sscanf(arrive_time,"%d:%d:%d",&h,&m,&s);
if(h<)
wait_time+=*-(*h+*m+s);
customer[len].arrive_time=*h+*m+s;
customer[len++].need_time=need_time*;
}
N=len; sort(customer,customer+N,cmp); for(i=;i<N;i++) {
int w=find_available_windows(customer[i].arrive_time);
if(w>=) {//找到空闲窗口
// windows[w].next_available_time=customer[i].arrive_time+customer[i].need_time;
if(customer[i].arrive_time<*) {
windows[w].next_available_time=*+customer[i].need_time;
} else {
windows[w].next_available_time=customer[i].arrive_time+customer[i].need_time;
}
} else { //找不到空闲窗口
w=find_earliest_window();
/* wait_time+=windows[w].next_available_time-customer[i].arrive_time;
* windows[w].next_available_time=(windows[w].next_available_time-customer[i].arrive_time)+customer[i].need_time;
*/
if(customer[i].arrive_time<*) {//如果到得早 窗口的下个可用时间等于当前下个可用时间加新来顾客所需要服务时间
wait_time+=windows[w].next_available_time-*;
windows[w].next_available_time=windows[w].next_available_time+customer[i].need_time;
} else {
wait_time+=windows[w].next_available_time-customer[i].arrive_time;
windows[w].next_available_time=windows[w].next_available_time+customer[i].need_time;
} }
} printf("%.1f\n",1.0*wait_time/60.0/N);
}
PAT 1017. Queueing at Bank的更多相关文章
- PAT 1017 Queueing at Bank[一般]
1017 Queueing at Bank (25)(25 分)提问 Suppose a bank has K windows open for service. There is a yellow ...
- PAT 1017 Queueing at Bank (模拟)
1017. Queueing at Bank (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Supp ...
- pat——1017. Queueing at Bank (java中Map用法)
由PAT1017例题展开: Suppose a bank has K windows open for service. There is a yellow line in front of the ...
- 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 ...
- PAT 1017 Queueing at Bank (模拟)
Suppose a bank has K windows open for service. There is a yellow line in front of the windows which ...
- PAT甲级1017. Queueing at Bank
PAT甲级1017. Queueing at Bank 题意: 假设一家银行有K台开放服务.窗前有一条黄线,将等候区分为两部分.所有的客户都必须在黄线后面排队,直到他/她轮到服务,并有一个可用的窗口. ...
- 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 ...
- PAT 甲级 1017 Queueing at Bank
https://pintia.cn/problem-sets/994805342720868352/problems/994805491530579968 Suppose a bank has K w ...
- PAT (Advanced Level) 1017. Queueing at Bank (25)
简单模拟. #include<iostream> #include<cstring> #include<cmath> #include<algorithm&g ...
随机推荐
- yii2源码学习笔记(十八)
View继承了component,用于渲染视图文件:yii2\base\View.php <?php /** * @link http://www.yiiframework.com/ * @co ...
- php 相对路径中 及 绝对路径中 的一些问题
写本篇文章,是为了以后学习中遇到问题好解决 php的相对路径是以当前工作目录为基准的,并不是以当前处理的文件目录为基准,这样导致我们在开发过程中总会遇到一些问题. 但是如果我们使用绝对路径,就会导致后 ...
- Python开发之--前端 HTML基础
一:HTML介绍 HTML:超文本标记语言,标准通用标记语言下的一个应用.包括"头"部分(英语:Head).和"主体"部分(英语:Body),其中"头 ...
- lucene 实现word,pdf全文检索源码
创建索引: import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import jav ...
- 基于opencv的小波变换
基于opencv的小波变换 提供函数DWT()和IDWT(),前者完成任意层次的小波变换,后者完成任意层次的小波逆变换.输入图像要求必须是单通道浮点图像,对图像大小也有要求(1层变换:w,h必须是2的 ...
- ALV 行列 颜色
1)颜色含义 1:海蓝:2:浅清:3:黄色:4:浅蓝:5:青色:6:红色:7:橙色.(1)首位为主颜色:(2)次位为辅助颜色:(3)末位为0时,表示首位数字表为表格的底色:末位为1时,则表示以1为底色 ...
- 【转】Spring 注解学习手札(超好的springmvc注解教程)
Spring 注解学习手札(一) 构建简单Web应用 Spring 注解学习手札(二) 控制层梳理 Spring 注解学习手札(三) 表单页面处理 Spring 注解学习手札(四) 持久层浅析 Spr ...
- uva 12206 - Stammering Aliens
基于hash的LCP算法: #include<cstdio> #include<cstring> #include<algorithm> #define maxn ...
- Central Europe Regional Contest 2012 Problem I: The Dragon and the Knights
一个简单的题: 感觉像计算几何,其实并用不到什么计算几何的知识: 方法: 首先对每条边判断一下,看他们能够把平面分成多少份: 然后用边来对点划分集合,首先初始化为一个集合: 最后如果点的集合等于平面的 ...
- 练习PYTHON协程之GREENLET
STACKLESS就算了,了解一下原理即可. GREENLET,GEVENT,EVENTLET这些,比较好测试,还是都 撸一次,得个印象. 测试代码都是网上的大路货. from greenlet im ...