[PAT] A1017 Queueing at Bank
【思路】
1:将所有满足条件的(到来时间点在17点之前的)客户放入结构体中,结构体的长度就是需要服务的客户的个数。结构体按照到达时间排序。
2:wend数组表示某个窗口的结束时间,一开始所有窗口的值都为8点整。每一个客户到来的时候,选择最早结束时间的窗口。如果最早结束时间比客户到得还早,那么他一来就能被服务,更新wend的值;如果最早结束时间比他晚,他需要等待,累加等待的时间,然后更新wend的值。
【坑】
测试点5:需要服务的客户数validn可能为0。此时它不能作为除数,所以要分开写。
测试点1:validn可能比窗口数k还小,我先用了一个循环是处理在窗口还没满的情况的,循环次数应该是k和validn当中较小的值,一开始没注意,直接写为了k。
测试点4:题目说“It is assumed that no window can be occupied by a single customer for more than 1 hour.”一开始也没注意,但是后来发现测试数据并没有用上这个条件,不明白。拒绝服务会出错,啥都不处理或者是需要的时间大于60分钟的只服务60分钟之后不再处理了都可以过这个测试数据。个人觉得他的意思可能是如果服务时间大于60分钟,就只服务60分钟,之后也不管了。感觉是题目不严谨。
【tips】
1:输入时间后直接转化为与00:00:00相差(或与08:00:00?但是有人到早的,不想出现负数嘿嘿)的分钟数(double类型),包括需要的时间和窗口处理结束时间wend都统一这么表示,就比较方便。
2:只需要计算平均等待时间,客户谁是谁不重要,但是要注意需要的服务时间need和到达时间arrive要跟着走,所以用结构体存了。
3:表达式计算中,加减连接的每一项都是double,才会返回double。如下函数,这些具体数字都必须手动写成小数的形式。
|
double TransTime(string a) { return ((a[0] - '0') * 10 + a[1] - '0') * 60.0 + ((a[3] - '0') * 10 + a[4] - '0')*1.0 + ((a[6] - '0') * 10 + a[7] - '0') / 60.0; } |
【AC代码】
#include<iostream>
#include<cstdio>
#include<string>
#include<math.h>
#include<algorithm>
using namespace std;
#define N 10000
#define K 100
struct people {
double arrive;
double need;
};
bool cmp(people a, people b)
{
return a.arrive < b.arrive;
}
double TransTime(string a)
{
return ((a[] - '') * + a[] - '') * 60.0 + ((a[] - '') * + a[] - '')*1.0 + ((a[] - '') * + a[] - '') / 60.0;
}
int FindMin(double a[], int k)
{
double min = a[];
int imin = ;
for (int i = ; i < k; i++)
if (min > a[i])
{
min = a[i];
imin = i;
}
return imin;
} int main()
{
int n, k;
cin >> n >> k;
int validn = n;
int i;
string time;
double wend[K];
people client[N];
for (i = ; i < validn; i++)
{
cin >> time;
cin >> client[i].need;
//if (client[i].need > 60)client[i].need = 60;
if (time > "17:00:00")
{
i--;
validn--;
}
else
client[i].arrive = TransTime(time);
}
sort(client, client + validn, cmp);
/*for (i = 0; i < validn; i++)
cout << (double)client[i].arrive << " " << client[i].need << endl;
*/ double wait = 0.00;
for (i = ; i < (k>validn?validn:k); i++)
{
if (client[i].arrive < )//8点前到了
{
wait += - client[i].arrive;
wend[i] = + client[i].need;
}
else
{
wend[i] = client[i].arrive + client[i].need;
}
}
while (i < validn)
{
int kmin = FindMin(wend, k);
double wendmin = wend[kmin];
if (client[i].arrive < wendmin)//有空位之前到了
{
wait += wendmin - client[i].arrive;
wend[kmin] += client[i].need;
}
else
{
wend[kmin] = client[i].arrive + client[i].need;
}
i++;
}
if (validn == )
cout << "0.0";
else printf("%.1f", wait / validn);
return ;
}
[PAT] A1017 Queueing at Bank的更多相关文章
- PAT A1017 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[一般]
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甲级——A1017 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
Suppose a bank has K windows open for service. There is a yellow line in front of the windows which ...
- A1017. 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 (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 ...
随机推荐
- O准备如何苟进复赛圈?华为软挑开挂指南(附赛题预测)
事先声明,这不是华为软挑的软广,我也不是海军. 这篇文章纯粹是心血来潮,原因是去年上传到github的参赛代码,前几天又有两个人star和fork了. 记得star热潮还是去年4月复赛刚结束的那几天, ...
- 二维数组转稀疏数组、稀疏数组恢复二维数组(Java实现)
public static void main(String[] args) { // 创建一个原始的二维数组 9*9 int chessArr1[][] = new int[9][9]; // 0表 ...
- 提升命令行效率的Bash快捷键
转自:http://linuxtoy.org/archives/bash-shortcuts.html 生活在 Bash shell 中,熟记以下快捷键,将极大的提高你的命令行操作效率. 大部分对其他 ...
- FTP - File Transfer Protocol
FTP - File Transfer Protocol FTP 实际上使用了两个 TCP 链接. 一个作为控制信道用, 主要传输一些指令和响应, 比如 ACK 或 错误码. 另一个链接是数据信道, ...
- MATLAB添加工具箱及无法连接到MathWorks问题
版本信息:官网下载的MATLAB R2019b 学生版 操作系统:Windows 10 在安装MATLAB时,需要我们自行选择要安装工具箱,如何在已安装MATLAB后添加当初没有选择安装的工具箱呢?第 ...
- 珠峰-buffer-流事件
#### Buffer // 字符串的二进制转10进制 let r = parseInt('11111111', 2); console.log(r); // 打印 255 // Number类型转为 ...
- Java集合那点事, 满满干货~
说到Java集合,可以说是初学者必踩的坑了. 那么怎么才能学好Java集合呢?个人认为关键是要理清楚思路,从上而下,建立一套完整的思维体系,这样才能更好的去认识事物的本质. 先确立一下学习Java集合 ...
- Linux内存管理解析(二) : 关于Linux内存管理的大体框架
什么是内存管理 ? 首先内存管理管理的主要对象是虚拟内存,但是虚拟内存对应的映射主要为物理内存,其次也可能通过交换空间把虚拟内存与硬盘映射起来,既然如此,那我们先了解物理内存的管理. 对于物理内存而言 ...
- 戏说前端之CSS编码规范
前言 项目启动时 css 应该注意哪些问题 文件名规范 文件名建议用小写字母加中横线的方式.为什么呢?因为这样可读性比较强,看起来比较清爽,像链接也是用这样的方式,例如 // 地址: github的地 ...
- CDQ分治笔记+例题
CDQ分治是一种离线分治算法,它基于时间顺序对操作序列进行分治. 看这样一个问题: 在一个三维坐标系中,有若干个点,每个点都有对应的坐标 \((X_i , Y_i , Z_i)\) ,我们要对于每个点 ...