题目分析:

本题我第一次尝试去做的时候用的是优先队列,但是效率不仅代码量很大,而且还有测试样例过不去,很显然没有找到一个好的数据结构来解决这道题目(随着逐渐的刷PAT甲级的题会发现有时选择一个好的解题方向真的比一些花里胡哨的技巧重要的多),对于本题,我们需要模拟的是一个去银行接受服务的过程,银行有k个窗口,而在8点开门之前所有到达的人都在门外排队(在8点后到达的人如果有人则需要排队,窗口中有空位则会选择最空闲的进行自己的服务),首先我们需要对n个用户按照到达的时间进行排序,然后建立一个window数组存放每个窗口结束被占用的的时间(最初始k个窗口都为28800,这是8点转化成了秒为单位,本题所有的时间都转化成了秒,方便计算,而上限值则是17点相对的秒数61200秒,用户在17点之后到达则无法接受服务且不会被加入有效等待人数中),对于用户队列,我们每次选择一个人,这个人将选择此时k个窗口中时间最小的,模拟用户接受服务的过程,而这个过程分为两种情况(1.轮到这个用户的时候,最小的窗口时间比用户到达的时间小,则表示在用户到达之前这个窗口已经空出来了,且没有人占用它,则这个用户的等待时间则为0,此时更新这个窗口的时间为该用户达到时间+该用户需要服务的时间 2.轮到这个用户的时候,最小的窗口时间比用户到达的时间大,则表示用户在到达的时候最近的一个窗口还正在被占用,则用户就需要等待的时间为:这个窗口的结束占用时间-用户到达的时间,然后这个用户接受服务,则也需要更新这个窗口的结束被占用时间为此时窗口时间+用户需要服务的时间)对于输入n为0的情况特判一下

 #include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std; struct Node{
int come, time; //记录每个人到达的时间和需要服务的时间
}; bool cmp(Node a, Node b){
return a.come < b.come;
} int main(){
int n, k;
while(scanf("%d%d", &n, &k) != EOF){
vector<Node> cus;
for(int i = ; i <= n; i++){
int hh, mm, ss, time;
scanf("%d:%d:%d%d", &hh, &mm, &ss, &time);
Node peo;
peo.come = hh * + mm * + ss;//到达的时间和被服务时间为秒
peo.time = time * ;
if(peo.come <= ) cus.push_back(peo); //只有在17点之前的人才会被服务
}
sort(cus.begin(), cus.end(), cmp);
int wait_sum = ; //总等待时间
vector<int> window(k, ); //对k个窗口初始化时间为8点 == 28800秒
for(int i = ; i < cus.size(); i++){ //对于所有排队的用户一个一个遍历(模拟寻找窗口的过程
int mi = window[];
int index = ;
for(int j = ; j < k; j++){ //找到窗口时间最小的
if(window[j] < mi){
mi = window[j];
index = j;
}
}
if(window[index] <= cus[i].come){
window[index] = cus[i].come + cus[i].time;
}else{
wait_sum += window[index] - cus[i].come;
window[index] += cus[i].time;
}
// cout<<"wait_sum"<<wait_sum<<endl;
}
if(cus.size() == ) printf("0.0\n");
else{
printf("%.1lf\n", wait_sum * 1.0 / cus.size() / );
}
}
return ;
}

PAT甲级1017题解——模拟排序的更多相关文章

  1. PAT甲级1017. Queueing at Bank

    PAT甲级1017. Queueing at Bank 题意: 假设一家银行有K台开放服务.窗前有一条黄线,将等候区分为两部分.所有的客户都必须在黄线后面排队,直到他/她轮到服务,并有一个可用的窗口. ...

  2. PAT甲级题分类汇编——排序

    本文为PAT甲级分类汇编系列文章. 排序题,就是以排序算法为主的题.纯排序,用 std::sort 就能解决的那种,20分都算不上,只能放在乙级,甲级的排序题要么是排序的规则复杂,要么是排完序还要做点 ...

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

  4. 2019秋季PAT甲级_C++题解

    2019 秋季 PAT (Advanced Level) C++题解 考试拿到了满分但受考场状态和知识水平所限可能方法不够简洁,此处保留记录,仍需多加学习.备考总结(笔记目录)在这里 7-1 Fore ...

  5. PAT 甲级 1017 Queueing at Bank

    https://pintia.cn/problem-sets/994805342720868352/problems/994805491530579968 Suppose a bank has K w ...

  6. PAT甲级1012题解——选择一种合适数据存储方式能使题目变得更简单

    题目分析: 本题的算法并不复杂,主要是要搞清楚数据的存储方式(选择一种合适的方式存储每个学生的四个成绩很重要)这里由于N的范围为10^6,故选择结构体来存放对应下标为学生的id(N只有2000的范围, ...

  7. PAT甲级1015题解——令人迷茫的翻译

    题目分析: 本题计算过程简单,但翻译令我迷茫:题意读清楚很重要(反正我是懵逼了)对于一个10进制的数,如果它是一个素数,把它转换成d进制,再将这个序列逆序排,这个逆序的d进制数的10进制表示如果也是素 ...

  8. PAT甲级1013题解——并查集+路径压缩

    题目分析: 本题初步浏览题目就知道是并查集的模板题,数据输入范围N为1~1000,则M的范围为0~1000^2,通过结构体记录每一对连线的关系,p[]数组记录每个节点的跟,对于k次查询,每次都要重新维 ...

  9. PAT甲级1004题解——并查集思想改

    题目分析:本题开始一直在考虑如何将每一个节点通过一种合适的数据结构存储起来(一对多的关系),最后发现借助并查集的思想可以用一个数组p,p[i]存放i节点的父节点,每次查询编号为i的节点属于第几层且判断 ...

随机推荐

  1. C# 获得本地通用网卡信息

    可以通过使用命名空间下的ManagementObjectSearcher类及其方法Get来获得通用网卡信息. 其中,最重要的是ManagementObjectSearcher构造函数的输入参数,可以传 ...

  2. 福州大学软件工程1916|W班 第10、11次作业成绩排名

    作业链接 项目Alpha冲刺(团队) 事后诸葛亮(团队) 评分细则 博客评分标准 本次作业包括现场Alpha答辩评分(映射总分为100分)+博客分(总分130分)+贡献度得分,其中博客分由以下部分组成 ...

  3. 【操作系统之九】Linux常用命令之netstat

    一.概念netstat命令用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP ...

  4. Proxy代理对象是如何调用invoke()方法的.

    直奔主题,不说废话.先看java使用Proxy创建代理对象的代码. //一个开发者接口public interface Developer { String code(); void debug(); ...

  5. Prometheus 安装部署

    Prometheus 安装部署 安装版本:prometheus-2.6.1 百度云下载:https://pan.baidu.com/s/1w16lQZKw8PCHqlRuSK2i7A 提取码:lw1q ...

  6. Elasticsearch常见用法-分布式集群

    集群内部工作方式 Elasticsearch用于构建高可用和可扩展的系统.扩展的方式可以是购买更好的服务器(纵向扩展(vertical scale or scaling up))或者购买更多的服务器( ...

  7. MATLAB datenum日期转换为Python日期

    摘要 MATLAB datenum时间格式参数众多,本文只简单关注 units 参数,即基准年份和计时度量(天.小时). 命令行演示在 ipython 和 Octave 中进行. 示例1:小时制,基准 ...

  8. C#读写修改设置调整UVC摄像头画面-滚动

    有时,我们需要在C#代码中对摄像头的滚动进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像 ...

  9. String.Operation

    // 字符串切割 StringField.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

  10. ASP.NET 异步编程之Async await

    本文重点介绍的是.NET Framework4.5 推出的异步编程方案  async await 请先看个5分钟的微软演示的视频:视频地址: https://channel9.msdn.com/Blo ...