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的节点属于第几层且判断 ...
随机推荐
- Ubuntu 16.04安装ANSYS 2019 R1
参考:<ANSYS15.0 for Linux下载及安装教程> 参考链接: https://wenku.baidu.com/view/92bdf21b312b3169a451a4b5.ht ...
- ping-pong buffer
1 什么是pingpong? pingpong是一种数据缓存的手段,通过pingpong操作可以提高数据传输的效率. 2 什么时候需要pingpong? 在两个模块间交换数据时,上一级处理的结果不能马 ...
- 2018-2019-2 网络对抗技术 20165230 Exp7 网络欺诈防范
实验目的 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 实验内容 简单应用SET工具建立冒名网站 ettercap DNS spoof 结合应用两种技术,用DNS sp ...
- 【07月02日】A股滚动市盈率PE最低排名
仅根据最新的市盈率计算公式进行排名,无法对未来的业绩做出预测. 方大集团(SZ000055) - 滚动市盈率PE:2.68 - 滚动市净率PB:1.2 - 滚动年化股息收益率:3.78% - 建筑产 ...
- OpenCV+TensorFlow图片手写数字识别(附源码)
初次接触TensorFlow,而手写数字训练识别是其最基本的入门教程,网上关于训练的教程很多,但是模型的测试大多都是官方提供的一些素材,能不能自己随便写一串数字让机器识别出来呢?纸上得来终觉浅,带着这 ...
- 解决 ImportError: cannot import name 'initializations' from 'keras' (C:\Users\admin\AppData\Roaming\Python\Python37\site-packages\keras\__init__.py)
解决 ImportError: cannot import name 'initializations' from 'keras' : [原因剖析] 上述代码用的是 Keras version: '1 ...
- A Philosophy of Software Design
关于复杂性,尚无统一的定义,从不同的角度可以给出不同的答案.可以用数量来度量,比如芯片集成的电子器件越多越复杂(不一定对):按层次性[2]度量,复杂度在于层次的递归性和不可分解性.在信息论中,使用熵来 ...
- python入门之函数对象
目录 函数是第一类对象 1.函数名可以被引用 2.函数名可以当做参数传递 3.函数名可以当做返回值使用 4.函数名可以被当做容器类型的元素 函数是第一类对象 First-Class Object : ...
- kubernetes 1.15 有哪些让人眼前一亮的新特性?
原文链接:kubernetes 1.15 有哪些让人眼前一亮的新特性? 2019 年 6 月 20 日,Kubernetes 重磅发布了 1.15 版本,不过笔者忙到现在才有空认真来看一下到底更新了哪 ...
- TestNG系列(四)TestNG监听器
前言 监听器实际上是一些预定义的java接口,用户创建这些接口的实现类(即implements某监听接口,并实现里面的方法),并加入到testng中,testng便会在运行的不同时刻调用这些类中你自定 ...