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的节点属于第几层且判断 ...
随机推荐
- Java 解压 zip 文件
代码如下 package test_java; import java.io.File; import java.io.FileOutputStream; import java.io.IOExcep ...
- win 10 禁用后置摄像头
2.双摄像头电脑,甄别时默认开启的是后置摄像头,识别不到人脸. (1)更换设备参加甄别: (2)自行调整:停用电脑后置摄像头,停用后甄别时会默认调取前置摄像头: 以下操作适用于Windows surf ...
- Android 及 iOS 常用操作命令
应用相关 1. 安装应用(真机) Android adb install xxx.apk iOS ideviceinstaller -i xxx.ipa 2. 卸载应用(真机) Android adb ...
- 正则表达式之re模块
re模块一.什么是正则表达式与re模块?1.1 字符组1.2 元字符1.2.1 单个使用1.2.2 组合使用二.为什么要使用正则三.如何使用3.1 re模块的三种比较重要的方法3.1.1 findal ...
- angular get 数据请求
数据请求 get 新建一个服务 1. ng g service services /+服务名 eg:ng g service services/player 在此服务中进行设置 引入自带组件以及注册 ...
- VisualSVN 新版本终于支持一个解决方案下多workcopy了,并解决了上个版本一个重要BUG
Multiple working copies within a single solution VisualSVN 7.0 and older require the solution file a ...
- servlet和response
servlet基础知识 Servlet在内存中是单例----单实例对象一个Servlet类 在内存中最多有一个对象 一个项目有多少功能,将来就有多少Servlet. servlet是自启动的,就是可以 ...
- Java学习:迭代器简介
迭代器 java.util.Iterator接口:迭代器(对集合进行遍历) 有两个常用的方法 boolean hasNext() 如果仍有元素可以迭代,则返回 true. 判断集合中还有没有下一个元素 ...
- IP地址和MAC地址绑定的必要性
计算机网络是一个共通的网络,世界上任何计算机都可以互相访问. 实现的原理基于网络通讯的互联网交互五层模型. 计算机网络的历史发展 当计算机网络技术初始利用的时代,几台计算机通过集线器连接,就可以实现网 ...
- axios捕获401 赋值token
//捕获401 // http request 拦截器 axios.interceptors.request.use( config => { const token = localStorag ...