【思路】

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的更多相关文章

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

  2. PAT 1017 Queueing at Bank[一般]

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

  3. PAT 1017 Queueing at Bank (模拟)

    1017. Queueing at Bank (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Supp ...

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

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

  6. A1017. Queueing at Bank

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

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

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

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

随机推荐

  1. 13-MyBatis03(逆向工程)

    MyBatis逆向工程 1.导入jar包 <dependency> <groupId>org.mybatis</groupId> <artifactId> ...

  2. node -- express框架

    express node的一个框架 安装express cnpm install express -S 引入 const express = require("express"); ...

  3. SAXParseException Content is not allowed in Prolog (前言中不允许有内容)

    解析 XML 文件的时候,如 Mybatis 的 Mapper 文件,有时会出现 org.xml.sax.SAXParseException 前言中不允许有内容 的异常,英文就是 Content is ...

  4. Javase-坦克大战小游戏,为什么会出现上方向和左方向的子弹不能发射的情况?检查了好久,有大佬帮帮忙吗,小白睡不着

    //为什么会出现上方向和左方向的子弹不能发射的情况?检查了好久,有大佬帮帮忙吗,小白睡不着 package TanKe.lbl;import java.awt.*;import java.awt.ev ...

  5. JMeter接口测试-如何循环使用接口返回的多值?

    前言 在用JMeter做接口测试的时候,经常会遇到这样一种情况:一个接口请求返回了多个值,然后下一个接口想循环使用前一个接口的返回值:第二种情况:只想循环请求前一个接口返回值中的随机不定长度的某一些值 ...

  6. 前端的Cookies

    Cookies cookies 特性 前端数据存储 后端通过 HTTP 头设置 请求时通过 HTTP 头传给后端 前端可读可写 遵守同源策略 域名 有效期 路径 http-only secure(ht ...

  7. sqli-labs-Basic Challenges

    sqli_labs注入学习 一.SQL基本语法 1.1show databases; 显示MySQL数据库里边所有的库: 1.2use [table name]; 使用特定的数据库: 1.3show ...

  8. Kubernetes CI/CD(2)

    本章节通过在Jenkins创建一个kubernetes云环境,动态的在kubernetes集群中创建pod完成pipeline的构建流程,关于直接在宿主机上搭建Jenkins集群的可参照Kuberne ...

  9. Codeforces Round447 D树上前缀和

    已知完全二叉树和每条边的权值,q次询问,每次给出sta起点和H. w=(H-点到sta的权值),求w>0的所有w的加和. 这题用树上前缀和来写,e[i]记录子树上的点到点i的距离,sum[i][ ...

  10. JavaScript九九乘法表

    JavaScript九九乘法表 <script> for (var i = 1; i < 10; i++) { for (var j = 1; j <= i; j++) { d ...