题目链接:点击查看

题目大意:给出规则,要求模拟客户到银行办理手续的过程:为了方便描述,下面将分为等待区和服务区来称呼

  1. 银行共有n个窗口,每个窗口最多可以有m个人排队,这里我们称为服务区
  2. 若窗口排队人数达到上限(n*m),则后续的人排成一列,这里我们称为等待区
  3. 每个客户进行服务的时间会给出
  4. 若服务区有人完成业务,会及时离开,后续的人往前走一个单位,此时服务区空出了一个位置可以排队,等待区的第一个人可以进入服务区继续等待
  5. 若等待区的人有多个窗口的位置可以选择,则选择编号最小的窗口进行服务
  6. 初始时所有客户都会同时到达银行,每个客户选择窗口时会优先选择排队人数较少的窗口,其次选择同等情况下窗口编号最小的进行服务
  7. 银行的服务时间从早晨8点服务到下午17点,到达下班时间后,后续排队的人将无法继续服务

给出上述银行的运行规则,现在我们会有q个询问,每次询问都是客户的编号,请输出客户完成手续后的离开时间,若无法进行服务,输出sorry

题目分析:这个题目可以归为中等难度的模拟题吧,不过我还有点喜欢这种看似繁琐,实际写起来很爽的模拟题,一开始是没有什么简单思路的,稍微想了一会,我发现可以从枚举分钟入手,因为毕竟银行就只上班九个小时,9*60=540的时间复杂度都可以忽略不计了。。这样一想这个题目就瞬间没有难度了,再配合上双端队列deque的辅助操作,就能轻轻松松完成这个题目了

有个小坑点,就是当客户在银行下班之前排上队了,但是在银行下班的时候却没有及时完成业务,此时这个客户是可以继续完成业务后再离开的,而不是输出sorry,这里记得特判一下,一开始没想到这里,WA了一半的样例。。

直接上代码吧,stl大法好:

#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<deque>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;struct Node
{int id;int remain;Node(int ID,int RE){id=ID;remain=RE;}
};//储存用户信息:编号和剩余时间int ans[N];//记录每个人的最终离开时间,-1代表没能服务deque<Node>win[25];//模拟每个窗口 bool check()//检查是否所有窗口都没人了
{for(int i=0;i<25;i++)if(win[i].size())return false;return true;
} int main()
{
//  freopen("input.txt","r",stdin);int n,m,c,w;scanf("%d%d%d%d",&n,&m,&c,&w);queue<Node>q;for(int i=1;i<=c;i++){int time;scanf("%d",&time);q.push(Node(i,time));}for(int i=1;i<=m;i++)//每列m个人 {for(int j=1;j<=n;j++)//n个窗口{if(!q.empty())//如果还有人在排队,依次放进服务区 {win[j].push_back(q.front());q.pop();}}}for(int time=1;time<=9*60;time++)//枚举时间{if(check()&&q.empty())//服务区和等待区都没人了 break;for(int i=1;i<=n;i++)//遍历每个窗口{if(win[i].empty())//如果该窗口没人了,跳过continue;Node cur=win[i].front();//取出第一个人 win[i].pop_front();cur.remain--;//过去一分钟了if(!cur.remain&&time!=9*60)//该用户的业务结束,最后一分钟需要特判 {ans[cur.id]=time;if(!q.empty())//如果等待区还有人 {win[i].push_back(q.front());//直接排在后面 q.pop();} } else//没结束或最后一分钟结束的话再放回原位{win[i].push_front(cur);}} }//下班了 for(int i=1;i<=n;i++)//服务区的人 {if(!win[i].empty())//当前的人说明还在服务,需要服务完才能离开{Node cur=win[i].front();win[i].pop_front();ans[cur.id]=9*60+cur.remain;}while(!win[i].empty())//其余的人都不能接受服务了{Node cur=win[i].front();win[i].pop_front();ans[cur.id]=-1;}}while(!q.empty())//等待区的人 {Node cur=q.front();q.pop();ans[cur.id]=-1;}while(w--){int x;scanf("%d",&x);if(ans[x]==-1)printf("Sorry\n");elseprintf("%02d:%02d\n",ans[x]/60+8,ans[x]%60);} return 0;
}

PAT (Advanced Level) 1014 Waiting in Line(模拟)相关推荐

  1. PAT (Advanced Level) 1014. Waiting in Line (30)

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

  2. PAT (Advanced Level) 1017 Queueing at Bank(模拟)

    题目链接:点击查看 题目大意:模拟银行服务的过程,输出每个客户的平均等待时间 题目分析:类似的银行服务模拟题,不过与之前那个题不太一样的是,这一次所需要统计的信息变少了,只需要统计一下每个客户的平均等 ...

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

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

  4. 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整除,输 ...

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

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

  6. 1014 Waiting in Line 队列操作

    目录 题目 输入样例 输出样例 提交结果截图 带详细注释的源代码 题目 题目链接:1014 Waiting in Line (PAT (Advanced Level) Practice) 输入样例 2 ...

  7. PAT (Advanced Level) Practice 题目集合(1001 ~ 1050)(正在更新)

    1001 A+B Format (20 分) 题目大意:计算a+b,结果按照西方的那种写数字的方式输出,从三个数一个逗号那种. #include<bits/stdc++.h> using ...

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

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

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

最新文章

  1. RDKit |基于集成学习(Ensemble learning)预测溶解度
  2. 索引名 oracle,ORACLE 索引名称矫情
  3. XX(北京)科技股份公司为啥需要购置服务器?
  4. Autofac在Asp.net MVC中在 Areas拆分到不同DLL下的注入失败问题
  5. C++面试题-面向对象-多态性与虚函数
  6. Django搭建登录注册功能
  7. CentOS7下安装JDK1.8过程记录
  8. 2022最新RTMP+HTTP直播地址汇总(亲测可用)
  9. IntelliJ IDEA破解版2018.3.1(亲测可用)
  10. 没想到曾经排名第一的安全软件,如今变成无法卸载的流氓~
  11. 回头再说012 盘点我的2008年
  12. Introduction to OOC Programming Language
  13. vue脚手架结构目录文件
  14. yuv 格式之 Semi Planar和Planar
  15. 【转载】网站关闭了域名备案信息是否需要注销,答案是一定要记得注销域名备案信息,防止域名过期后被他人注册用于非法用途而带来不必要的麻烦...
  16. Redis全部知识总结(概念、安装、用法、数据类型、事务、持久化、Jeids、订阅系统、缓存穿透及雪崩等)
  17. ADI Blackfin DSP处理器-BF533的开发详解1:软件和硬件的准备
  18. 【C语言】厘米换算英尺英寸
  19. .net mvc lambda表达式Contains方法
  20. 谈谈Django REST Framework(DRF)中的序列化器

热门文章

  1. Spring新注解详解
  2. Azkaban-solo模式-安装
  3. SpringBoot异常处理-自定义HandlerExceptionResolver
  4. eureka架构图原理
  5. MySQL复制性能优化
  6. myeclipse 项目右键没有svn_新建SVN仓库并上传项目
  7. qt撤销与回退_Qt动画框架
  8. 200924阶段一C++STL
  9. solidity智能合约[37]-以太坊虚拟机数据存储
  10. Linux系统管理初步(七)系统服务管理、chkconfig与systemd 编辑中