PAT甲级1017题解——模拟排序
题目分析:
本题我第一次尝试去做的时候用的是优先队列,但是效率不仅代码量很大,而且还有测试样例过不去,很显然没有找到一个好的数据结构来解决这道题目(随着逐渐的刷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题解——模拟排序的更多相关文章
- PAT甲级1017. Queueing at Bank
PAT甲级1017. Queueing at Bank 题意: 假设一家银行有K台开放服务.窗前有一条黄线,将等候区分为两部分.所有的客户都必须在黄线后面排队,直到他/她轮到服务,并有一个可用的窗口. ...
- PAT甲级题分类汇编——排序
本文为PAT甲级分类汇编系列文章. 排序题,就是以排序算法为主的题.纯排序,用 std::sort 就能解决的那种,20分都算不上,只能放在乙级,甲级的排序题要么是排序的规则复杂,要么是排完序还要做点 ...
- 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 ...
- 2019秋季PAT甲级_C++题解
2019 秋季 PAT (Advanced Level) C++题解 考试拿到了满分但受考场状态和知识水平所限可能方法不够简洁,此处保留记录,仍需多加学习.备考总结(笔记目录)在这里 7-1 Fore ...
- PAT 甲级 1017 Queueing at Bank
https://pintia.cn/problem-sets/994805342720868352/problems/994805491530579968 Suppose a bank has K w ...
- PAT甲级1012题解——选择一种合适数据存储方式能使题目变得更简单
题目分析: 本题的算法并不复杂,主要是要搞清楚数据的存储方式(选择一种合适的方式存储每个学生的四个成绩很重要)这里由于N的范围为10^6,故选择结构体来存放对应下标为学生的id(N只有2000的范围, ...
- PAT甲级1015题解——令人迷茫的翻译
题目分析: 本题计算过程简单,但翻译令我迷茫:题意读清楚很重要(反正我是懵逼了)对于一个10进制的数,如果它是一个素数,把它转换成d进制,再将这个序列逆序排,这个逆序的d进制数的10进制表示如果也是素 ...
- PAT甲级1013题解——并查集+路径压缩
题目分析: 本题初步浏览题目就知道是并查集的模板题,数据输入范围N为1~1000,则M的范围为0~1000^2,通过结构体记录每一对连线的关系,p[]数组记录每个节点的跟,对于k次查询,每次都要重新维 ...
- PAT甲级1004题解——并查集思想改
题目分析:本题开始一直在考虑如何将每一个节点通过一种合适的数据结构存储起来(一对多的关系),最后发现借助并查集的思想可以用一个数组p,p[i]存放i节点的父节点,每次查询编号为i的节点属于第几层且判断 ...
随机推荐
- centos里的压缩解压命令tar总结
压缩 tar czvf 压缩文件名称.tar.gz 文件或者目录名称 比如:tar czvf backup.tar.gz /etc,把/etc目录打包成文件backup.tar.gz c是打包 z是g ...
- json for modern c++(nlohmann json)使用小计
前言 一开始使用jsoncpp,但是jsoncpp已经不更新了,nlohmann还在更新,并且jsoncpp做过一次大的版本升级,导致api不兼容,以前使用过的工程代码不能很好的升级到新的版本,并且j ...
- 【神经网络与深度学习】chainer边运行边定义的方法使构建深度学习网络变的灵活简单
Chainer是一个专门为高效研究和开发深度学习算法而设计的开源框架. 这篇博文会通过一些例子简要地介绍一下Chainer,同时把它与其他一些框架做比较,比如Caffe.Theano.Torch和Te ...
- Beta冲刺(3/7)——2019.5.25
作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Beta冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 队 ...
- 修改Centos7用户默认家目录
vim /etc/default/useradd # useradd defaults file GROUP= HOME=/home INACTIVE=- EXPIRE= SHELL=/bin/bas ...
- 【C语言】获得数组长度
c语言中,定义数组后可以用sizeof命令获取数组的长度(可容纳元素个数): 如: { int data[5]; int length; length=sizeof(data)/sizeof(data ...
- 60 网络编程(二)——URL
认识URI.URL.URN 详细请参考:https://blog.51cto.com/xoyabc/1905492 URI:uniform resource Indent 统一资源标识符 URL:un ...
- TestNG系列(五)TestNG测试报告
以TestNG执行测试方法后会生成test-output测试结果集,其中index.html是测试结果的展示.TestNG的测试报告可以通过IReporter监听自定义,也可以通过第三方工具(Repo ...
- Centos7通过yum安装jdk8
1.Centos7通过yum安装jdk8 2.Centos7通过yum安装jdk8
- Wireshark教程之二:Wireshark捕获数据分析
使用 Wireshark 选择需要抓包的网络方式,并设置过滤器条件,当有数据通信后即可抓到对应的数据包,这里将分析其每一帧数据包的结构. 以HTTP协议为例,一帧数据包一般包括以下几个部分: Fram ...