题意:n个窗口,每个窗口可以排m人。有k为顾客需要办理业务,给出了每个客户的办理业务时间。
银行在8点开始服务,如果窗口都排满了,客户就得在黄线外等候。如果有一个窗口用户服务结束,
黄线外的客户就进来一个。如果有多个可选,选窗口id最小的。
输出查询客户的服务结束时间。

如果客户在17点(注意是包括的!!!就在这里被坑了,一开始还以为不包括。。。)或者以后还没开始服务,就输出Sorry
如果已经开始了,无论多长都会继续服务的。

思路:
建立一个优先级队列,存储在黄线之内的所有客户。
对于m*n之前的人,依此往窗口里排队(即优先级队列里)即可。
对于之后的人,从优先级队列里取出结束时间最少的客户,有相同的话则是窗口最小的,
进入他所在的队列。
同时还要建立linetime数组,存储每个窗口排在末尾客户的结束时间。
当窗口j新加进来一个客户,他的起始时间则是linetime[j],结束时间则是linetime[j]+服务时间,同时更新linetime[j]

最后对于查询的客户,如果起始时间>=17:00,则输出Sorry
否则输出对应的结束时间即可,这里方便起见,以分数存储的,所以最后还要转化一下。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=+;
int n,m,k,q;
struct Customer{
int line;
int start_time=;
int end_time=;
int process_time;
bool operator<(const Customer tmp)const{
/*
取队列中最早结束的,如果时间一样,取窗口id最小的
*/
if(end_time==tmp.end_time)
return line>tmp.line;
else
return end_time>tmp.end_time;
}
}cus[maxn];
int query[maxn];
int finish_time[maxn];
int main()
{
scanf("%d %d %d %d",&n,&m,&k,&q);
for(int i=;i<=k;i++){
scanf("%d",&cus[i].process_time);
}
for(int i=;i<=q;i++){
scanf("%d",&query[i]);
}
priority_queue<Customer>queueline;
int cnt=;
Customer tmp;
int linetime[maxn];
memset(linetime,,sizeof(linetime));
//对于前m*n个人,往队列里插即可
for(int i=;i<=m && cnt<k;i++){
for(int j=;j<n && cnt<k;j++){
cnt++;
tmp.line=j;
tmp.start_time=linetime[j];
tmp.end_time=linetime[j]=tmp.start_time+cus[cnt].process_time;
cus[cnt].line=j;
cus[cnt].start_time=tmp.start_time;
cus[cnt].end_time=tmp.end_time;
queueline.push(tmp);
}
}
Customer c;
for(int i=cnt+;i<=k;i++){
//取出结束时间最早的
tmp=queueline.top();
queueline.pop();
c.line=tmp.line;
c.start_time=linetime[tmp.line];
c.end_time=linetime[tmp.line]=c.start_time+cus[i].process_time;
cus[i].line=c.line;
cus[i].start_time=c.start_time;
cus[i].end_time=c.end_time;
queueline.push(c);
}
int cid;
int maxtime=(-)*;
for(int i=;i<=q;i++){
cid=query[i];
///原来开始的时间包括17:00。。。只要是17:00或者是以后的,就不被服务
///原来写的是>,结果一部分样例一直没过,还以为自己前面写错了
if(cus[cid].start_time>=maxtime)
printf("Sorry\n");
else{
int hour=cus[cid].end_time/;
int minu=cus[cid].end_time%;
printf("%02d:%02d\n",hour+,minu);
}
}
return ;
}

PAT甲题题解-1014. Waiting in Line (30)-模拟,优先级队列的更多相关文章

  1. PAT甲题题解-1068. Find More Coins (30)-dp,01背包

    一开始没多想,虽然注意到数据N<=10^4的范围,想PAT的应该不会超时吧,就理所当然地用dfs做了,结果最后一组真的超时了.剪枝啥的还是过不了,就意识到肯定不是用dfs做了.直到看到别人说用0 ...

  2. 【PAT Advanced Level】1014. Waiting in Line (30)

    简单模拟题,注意读懂题意就行 #include <iostream> #include <queue> using namespace std; #define CUSTOME ...

  3. PAT甲题题解-1095. Cars on Campus(30)-(map+树状数组,或者模拟)

    题意:给出n个车辆进出校园的记录,以及k个时间点,让你回答每个时间点校园内的车辆数,最后输出在校园内停留的总时间最长的车牌号和停留时间,如果不止一个,车牌号按字典序输出. 几个注意点: 1.如果一个车 ...

  4. 【PAT甲级】1014 Waiting in Line (30 分)(队列维护)

    题面: 输入四个正整数N,M,K,Q(N<=20,M<=10,K,Q<=1000),N为银行窗口数量,M为黄线内最大人数,K为需要服务的人数,Q为查询次数.输入K个正整数,分别代表每 ...

  5. PAT甲题题解-1017. Queueing at Bank (25)-模拟

    有n个客户和k个窗口,给出n个客户的到达时间和需要的时长有空闲的窗口就去办理,没有的话就需要等待,求客户的平均时长.如果在8点前来的,就需要等到8点.如果17点以后来的,则不会被服务,无需考虑. 按客 ...

  6. PAT甲题题解-1056. Mice and Rice (25)-模拟题

    有n个老鼠,第一行给出n个老鼠的重量,第二行给出他们的顺序.1.每一轮分成若干组,每组m个老鼠,不能整除的多余的作为最后一组.2.每组重量最大的进入下一轮.让你给出每只老鼠最后的排名.很简单,用两个数 ...

  7. PAT甲题题解-1076. Forwards on Weibo (30)-BFS

    题目大意:给出每个用户id关注的人,和转发最多的层数L,求一个id发了条微博最多会有多少个人转发,每个人只考虑转发一次.用BFS,同时每个节点要记录下所在的层数,由于只能转发一次,所以每个节点要用vi ...

  8. PAT甲题题解-1105. Spiral Matrix (25)-(模拟顺时针矩阵)

    题意:给定N,以及N个数.找出满足m*n=N且m>=n且m-n最小的m.n值,建立大小为m*n矩阵,将N个数从大到下顺时针填入矩阵中. #include <iostream> #in ...

  9. PAT甲题题解-1109. Group Photo (25)-(模拟拍照排队)

    题意:n个人,要拍成k行排队,每行 n/k人,多余的都在最后一排. 从第一排到最后一排个子是逐渐增高的,即后一排最低的个子要>=前一排的所有人 每排排列规则如下: 1.中间m/2+1为该排最高: ...

随机推荐

  1. MySQL基础之 排序与限制,聚合

    排序与限制 ORDER BY 作用:取出按照某个字段进行排序后的记录结果集. 配合:常与DESC  和ASC一块使用:默认是ASC,表示升序.DESC表示降序 LIMIT 作用:用于显示数据的一部分记 ...

  2. Oracle 导出用户下的所有索引创建语句

    SELECT dbms_lob.substr(dbms_metadata.get_ddl('INDEX', INDEX_NAME))||';'  from dba_indexes where owne ...

  3. 网络唤醒(WOL)全解指南:原理篇

    什么是网络唤醒 网络唤醒(Wake-on-LAN,WOL)是一种计算机局域网唤醒技术,使局域网内处于关机或休眠状态的计算机,将状态转换成引导(Boot Loader)或运行状态.无线唤醒(Wake-o ...

  4. react native环境搭建(含错误处理)

    1.  Python 2  注意,不要选择3.0及以上的,还不成熟 安装过程中一直 next就可以了,但是注意下图,勾选添加到系统环境变量 安装完之后cmd输入 python 查看是否安装成功. 补充 ...

  5. 【洛谷P3410】拍照题解(最大权闭合子图总结)

    题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...

  6. Array对象的方法

    * Array.isArray(对象)---->判断这个对象是不是数组 * instanceof关键字 * .concat(数组,数组,数组,...) 组合一个新的数组 * .every(函数) ...

  7. Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解

    前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY  <源路径> .. ...

  8. 常见的CSS属性和值CascadingStyleSheets

    字体文本背景位置边框列表其他 CSS中修饰字体的属性 属    性 描    述 属  性  值 font-family 字体族科 任意字体族科名称都可以使用例如Times.serif等,而且多个族科 ...

  9. error occurred at recursive SQL level 1

    ORA-00604: error occurred at recursive SQL level 1出现的错误:java.sql.SQLException: ORA-00604: error occu ...

  10. Windows7系统下OpenCV2.4.4+PCL1.6.0+SSBA3.0+VS2010 IDE32环境下编译和安装以实现Sfm和PCL点云数据可视化

    最近在学习<深入理解OpenCV:实用计算机视觉项目解析>一书的第三章和第四章时,遇到很多编译问题,书中又没有详细的讲解环境配置和搭建过程.经过多天的捉摸.调试.排错终于将两章的程序都调试 ...