题目链接:点击查看

题目大意:模拟银行服务的过程,输出每个客户的平均等待时间

题目分析:类似的银行服务模拟题,不过与之前那个题不太一样的是,这一次所需要统计的信息变少了,只需要统计一下每个客户的平均等待时间,加上每个客户到达银行的时间也不再统一,我们需要重新制定规则

最后还有一个坑点,就是只要用户在银行下班之前到达银行,那么无论多晚该用户都可以完成服务,所以需要统计等待时间,相对的,所有超过下班时间到达的用户,都不算数,最后计算平均值得时候也不用算上他们

具体实现的话,我还是用一层for循环当秒表用,每次走一秒,判断用户当前的情况,需要注意的是,因为在输入的时候就已经将不合法的用户排除在外了,所以我们秒表的下限是早晨八点,上限必须设置到第二天一点,也就是25点,当然设大了也没关系,一开始我设置了一个1700点,一样能过,因为有一个剪枝,所以并不会因为这个上限过大而超时,反而会因为上限过小而答案错误

这里就对应着最后一个测试点了:

为什么上限设置到下午五点会答案错误呢?因为整个程序模拟的是在秒表下限到上限中用户的等待时间的,若超过了下班时间,则还在排队的用户就没办法记录了,我们需要将上限设置的大一点才行,比如随便举个例子:

2 1

17:00:00 60

16:59:59 60

正确答案应该是30分钟吧(60/2),这样一个例子就能让银行的工作时间到达下午七点,若再来几组相似的样例,银行工作的上限会变得很大很大,不过这个题目还算是良心的,将时间设到第二天凌晨一点就能过掉了。。

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e4+100;struct Node
{int time;int remain;Node(){}Node(int TIME,int REMAIN){time=TIME;remain=REMAIN;}bool operator<(const Node& a)const{return time>a.time;}
};int n,m;int win[110];queue<Node>wait;//在排队的人 priority_queue<Node>line;//所有人 bool check()
{for(int i=1;i<=m;i++)if(win[i])return false;return true;
}int main()
{
//  freopen("input.txt","r",stdin);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int h,m,s,temp;scanf("%d:%d:%d %d",&h,&m,&s,&temp);if(17*60*60<h*60*60+m*60+s)continue;line.push(Node(h*60*60+m*60+s,temp*60));}n=line.size();int ans=0;for(int i=1;i<=m;i++)//先让提前来的人去窗口前面等着 {if(line.empty()||line.top().time>=8*60*60)//如果提前来的人没了 break;Node cur=line.top();line.pop();win[i]=cur.remain;ans+=8*60*60-cur.time;}while(line.size()&&line.top().time<8*60*60)//提前来的人很多,就先排队,并记录等待时间 {Node cur=line.top();line.pop();wait.push(cur);ans+=8*60*60-cur.time;}for(int i=8*60*60;i<=25*60*60;i++)//枚举秒 {if(check()&&line.empty()&&wait.empty())//没人了 break;if(!line.empty()&&line.top().time==i)//新来了一个人,先去排队 {wait.push(line.top());line.pop();}for(int j=1;j<=m;j++)//枚举每一个窗口 {if(win[j])//还有人在办手续 win[j]--;//时间-1s if(!win[j])//窗口没人了 {if(!wait.empty())//还有人在排队 {win[j]=wait.front().remain;//补上来 wait.pop();}}}ans+=wait.size();}printf("%.1f\n",1.0*ans/60/n);return 0;
}

PAT (Advanced Level) 1017 Queueing at Bank(模拟)相关推荐

  1. PAT (Advanced Level) 1017. Queueing at Bank (25)

    简单模拟. #include<iostream> #include<cstring> #include<cmath> #include<algorithm&g ...

  2. PAT (Advanced Level) 1140~1143:1140模拟 1141模拟 1142暴力 1143 BST+LCA

    1140 Look-and-say Sequence(20 分) 题意:观察序列D, D1, D111, D113, D11231, D112213111, ...,显然后一个串是对前一个串每一小段连 ...

  3. PAT (Advanced Level) 1132~1135:1132 模拟 1133模拟(易超时!) 1134图 1135红黑树

    1132 Cut Integer(20 分) 题意:将一个含K(K为偶数)个数字的整数Z割分为A和B两部分,若Z能被A*B整除,则输出Yes,否则输出No. 分析:当A*B为0的时候,不能被Z整除,输 ...

  4. PAT (Advanced Level) 1014 Waiting in Line(模拟)

    题目链接:点击查看 题目大意:给出规则,要求模拟客户到银行办理手续的过程:为了方便描述,下面将分为等待区和服务区来称呼 银行共有n个窗口,每个窗口最多可以有m个人排队,这里我们称为服务区 若窗口排队人 ...

  5. PAT (Advanced Level) 1016 Phone Bills(恶心模拟)

    题目链接:点击查看 题目大意:模拟电话收费规则: 每个时间段的收费不同,时间段分为:00:00-01:00,01:00-02:00诸如此类 最开始给出的单价是每分钟的单价 最后输出每个用户的电话费 题 ...

  6. PAT甲级1017 Queueing at Bank:[C++题解]字符串、结构体、最小堆

    文章目录 题目分析 题目链接 题目分析 客户数据用什么存呢? 好吧,还是用结构体. 结构体里面存什么呢? 到达时间 和服务时间. 窗口怎么存呢? 将窗口的开始服务时间从小到大存,自然想到小根堆. pr ...

  7. PAT 1017 Queueing at Bank[一般]

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

  8. PAT (Advanced Level) Practice 题解代码 - II (1051-1100)

    PAT PAT (Advanced Level) Practice - II(1051-1100) -------------------------------------------------- ...

  9. PAT (Advanced Level) Practice 1043 Is It a Binary Search Tree (25 分) 凌宸1642

    PAT (Advanced Level) Practice 1043 Is It a Binary Search Tree (25 分) 凌宸1642 题目描述: A Binary Search Tr ...

最新文章

  1. CentOS 6.x 播放 mp3 音乐 —— 成功
  2. java学习笔记4--对象的初始化与回收
  3. 云计算面试题及答案,云计算主要就业岗位
  4. 多款优秀的 JS MVC 框架对比
  5. 【三维深度学习】基于片元的渐进式三维点云上采样模型
  6. Linux搜狗输入法候选词乱码
  7. 苹果赢了!iOS14隐私功能并不违反法国反垄断法
  8. 打造全自动的NOD32升级服务器
  9. Linux中安装tree命令
  10. 学术论文参考文献格式
  11. 数据库事务的四大特性,四种隔离级别,如何避免脏读、不可重复读、幻读(如何加锁)?
  12. kneighbors()返回值indices、distances详解
  13. QuerySet浅尝
  14. 4个女人要过一座桥的问题
  15. any,和unknown的区别
  16. 开源弹幕引擎·烈焰弹幕使(DanmakuFlameMaster)使用解析
  17. 如何实现报表数据的动态层次钻取(一)
  18. 一次尴尬的笔试。。。
  19. 轻量级java snmp设备网管软件开发技术
  20. JavaBean技术的使用

热门文章

  1. 多对多(many-to-many)
  2. SpringSecurity案例之认证服务搭建
  3. Kafka本身的架构
  4. 自定义ChannelHandler 的添加过程
  5. 为什么需要ORM 框架
  6. RocketMQ消息发送及消费的基本原理
  7. RocketMQ核心架构和概
  8. 前端框架:发送请求获取数据的执行逻辑
  9. 数据库-优化-数据库结构的优化-数据类型
  10. Nginx教程--配置