队列模拟题——pat1026. Table Tennis
题意自己理解了,主要是两个队列维护,一个VIP队列,一个普通队列
搜集了一些坑(有些坑转自别的网站用于广大同学的测试之用)
普通人也有VIP的权益!!! 屌丝逆袭有木有!!!
9
20:52:00 10 0
08:00:00 20 0
08:02:00 30 0
20:51:00 10 0
08:10:00 5 0
08:12:00 10 1
20:50:00 10 0
08:01:30 15 1
20:53:00 10 1
10 10
1 2 3 4 5 6 7 8 9 10
08:00:00 08:00:00 0
08:01:30 08:01:30 0
08:02:00 08:02:00 0
08:10:00 08:10:00 0
08:12:00 08:12:00 0
20:50:00 20:50:00 0
20:51:00 20:51:00 0
20:52:00 20:52:00 0
20:53:00 20:53:00 0
2 2 2 2 1 0 0 0 0 0
1.当有多个乒乓球台空闲时,vip顾客到了会使用最小id的vip球台,而不是最小id的球台,测试以下用例:
2
10:00:00 30 1
12:00:00 30 1
5 1
3
输出正确结果应为:
10:00:00 10:00:00 0
12:00:00 12:00:00 0
0 0 2 0 0
2.题目要求每对顾客玩的时间不超过2小时,那么当顾客要求玩的时间>2小时的时候,应该截断控制,测试以下用例:
2
18:00:00 180 1
20:00:00 60 1
1 1
1
输出的正确结果应为:
18:00:00 18:00:00 0
20:00:00 20:00:00 0
2
3.虽然题目中保证客户到达时间在08:00:00到21:00:00之间,但是根据最后的8个case来看,里面还是有不在这个时间区间内到达的顾客,所以建议还是稍加控制,测试以下用例:
1
21:00:00 80 1
1 1
1
输出的正确结果应为:
0
4.题目中说的round up to an integer minutes是严格的四舍五入,需要如下做:
wtime = (stime - atime + 30) / 60
而不是:
wtime = (stime - atime + 59) / 60
代码这次写的还是可以一看的,就贴上来吧
#include<stdio.h>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std; struct VIPdata{//vip队列
int starts;
int startget;
int lasts;
int VIP;
int id; friend bool operator <(VIPdata x,VIPdata y){
if(x.VIP==y.VIP)
return x.starts>y.starts;
else
return x.VIP<y.VIP;
}
}s[]; struct Ordata{//普通队列
int starts;
int startget;
int lasts;
int VIP;
int id;
Ordata(int a,int b,int c,int d,int e){
starts=a;startget=b;lasts=c;VIP=d;id=e;
}
friend bool operator <(Ordata x,Ordata y){
return x.starts>y.starts;
}
}; int ifplay[];//某人是否已经玩过 int cmp(VIPdata x,VIPdata y){
return x.starts<y.starts;
} struct Table{
int ifuse;
int end;
int vip;
int useNum;
}table[]; int main(){
int n,tableNum,VipNum,PuNum;
while(scanf("%d",&n)!=EOF){
int i,hh,mm,ss,j;
for(i=;i<=n;i++){
ifplay[i]=;
scanf("%d:%d:%d",&hh,&mm,&ss);
s[i].starts=hh*+mm*+ss;
scanf("%d",&mm);
if(mm>)mm=;//不要超过2个小时
s[i].lasts=mm*;
scanf("%d",&s[i].VIP);
s[i].id=i;
}
scanf("%d",&tableNum);
scanf("%d",&VipNum);
PuNum=tableNum-VipNum; for(i=;i<=tableNum;i++){
table[i].ifuse=;
table[i].end=;
table[i].vip=;
table[i].useNum=;
}
int temp;
for(i=;i<=VipNum;i++){
scanf("%d",&temp);
table[temp].vip=;
} sort(&s[],&s[+n],cmp);
//for(i=1;i<=n;i++){
// printf("%02d:%02d:%02d %d\n",s[i].starts/3600,(s[i].starts%3600)/60,s[i].starts%60,s[i].VIP);
//}
int first=*,end=*;
int Vipnow=,Punow=;
priority_queue<Ordata>Orqq;
priority_queue<VIPdata>VIPqq; j=;
int k,x;
for(i=first;i<end;i++){
for(k=;k<=tableNum;k++){//退台球桌
if(table[k].ifuse==)continue;
if(table[k].end==i){
table[k].ifuse=;
if(table[k].vip==)Vipnow--;
else Punow--;
table[k].ifuse=;
}
} //到点的人排队
while(s[j].starts==i&&j<=n){
Orqq.push(Ordata(s[j].starts,s[j].startget,s[j].lasts,s[j].VIP,s[j].id));
VIPqq.push(s[j]);j++;
} if((Vipnow+Punow)==tableNum)continue;
for(k=Vipnow+;k<=VipNum;k++){//排队中的人进台球桌 有VIP桌先满足VIP
if(VIPqq.empty())break;
if(VIPqq.top().VIP==)break; while(!VIPqq.empty()&&ifplay[VIPqq.top().id]==/*||(VIPqq.top().lasts+i)>end)*/){
VIPqq.pop();
}if(VIPqq.empty())break; int rx=-;
for(x=;x<=tableNum;x++){
if(table[x].ifuse==)continue;
if(table[x].vip==)continue;
rx=x;break;
}if(rx==-)break; printf("%02d:%02d:%02d",(VIPqq.top().starts/),(VIPqq.top().starts%)/,VIPqq.top().starts%);
printf(" %02d:%02d:%02d",(i/),(i%)/,i%);
printf(" %d\n",(i-VIPqq.top().starts+)/);//这里注意+30 table[rx].end=VIPqq.top().lasts+i;
table[rx].ifuse=;
table[rx].useNum++;
Vipnow++;
ifplay[VIPqq.top().id]=;
VIPqq.pop(); } //排队中的人进台球桌 现在按普通队列排
if((Vipnow+Punow)==tableNum)continue;
for(k=;k<=tableNum;k++){//普通人也可以玩VIP桌子
if(Orqq.empty())break; while(!Orqq.empty()&&ifplay[Orqq.top().id]==){
Orqq.pop();
}if(Orqq.empty())break; int rx=-;
for(x=;x<=tableNum;x++){
if(table[x].ifuse==)continue;
rx=x;break;
}if(rx==-)break; printf("%02d:%02d:%02d",(Orqq.top().starts/),(Orqq.top().starts%)/,Orqq.top().starts%);
printf(" %02d:%02d:%02d",(i/),(i%)/,i%);
printf(" %d\n",(i-Orqq.top().starts+)/);//这里注意+30 table[rx].end=Orqq.top().lasts+i;
table[rx].ifuse=;
table[rx].useNum++;
if(table[rx].vip==)Vipnow++;
else
Punow++;
ifplay[Orqq.top().id]=;
Orqq.pop();
}
}
int ok=;
for(i=;i<=tableNum;i++){
if(ok==)ok=;
else printf(" ");
printf("%d",table[i].useNum);
}printf("\n");
}
return ;
}
队列模拟题——pat1026. Table Tennis的更多相关文章
- uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列
题目很简单,给一个队列以及文件的位置,然后一个一个检查,如果第一个是优先级最高的就打印,否则放到队列后面,求所要打印的文件打印需要花费多长时间. 这里我用数组模拟队列实现,考虑到最糟糕的情况,必须把数 ...
- PAT 甲级 1026 Table Tennis(模拟)
1026. Table Tennis (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A table ...
- PAT A1026 Table Tennis (30 分)——队列
A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For a ...
- Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) C. Table Tennis Game 2 水题
C. Table Tennis Game 2 题目连接: http://codeforces.com/contest/765/problem/C Description Misha and Vanya ...
- Codeforces Round #304 (Div. 2) C. Soldier and Cards —— 模拟题,队列
题目链接:http://codeforces.com/problemset/problem/546/C 题解: 用两个队列模拟过程就可以了. 特殊的地方是:1.如果等大,那么两张牌都丢弃 : 2.如果 ...
- Pat(Advanced Level)Practice--1026(Table Tennis)
Pat1026代码 题目描写叙述: A table tennis club has N tables available to the public. The tables are numbered ...
- PAT甲级1026. Table Tennis
PAT甲级1026. Table Tennis 题意: 乒乓球俱乐部有N张桌子供公众使用.表的编号从1到N.对于任何一对玩家,如果有一些表在到达时打开,它们将被分配给具有最小数字的可用表.如果所有的表 ...
- 1026. Table Tennis (30)
题目如下: A table tennis club has N tables available to the public. The tables are numbered from 1 to N. ...
- PAT 1026 Table Tennis[比较难]
1026 Table Tennis (30)(30 分) A table tennis club has N tables available to the public. The tables ar ...
随机推荐
- Shell test 命令,Shell 输入/输出重定向
一.Shell test 命令 Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 -g ...
- Repeat a string repeat a string
重要的事情说3遍! 重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串. 这是一些对你有帮助的资源: Global String Object 这道题的思路就是按照题目要求一步一步 ...
- section和div
section和div 一.DIV div即division(区块),把文档分割为独立的.不同的部份.作用,以下三种情况应该用div标签: 1.用于页面布局,且不是 header.footer 之类的 ...
- SQL语句中各个部分的执行顺序(转)
原文链接:http://www.tuicool.com/articles/fERNv2 写在前面的话:有时不理解SQL语句各个部分执行顺序,导致理解上出现偏差,或者是书写SQL语句时随心所欲,所以有必 ...
- vim学习相关链接
1:http://blog.csdn.net/niushuai666/article/details/7275406 2:http://ju.outofmemory.cn/entry/79671 3. ...
- Python自定义大小截屏
蝈蝈这两天正忙着收拾家当去公司报道,结果做PHP的发小蛐蛐找到了他,说是想要一个可以截图工具. 大致需要做出这样的效果. 虽然已经很久不写Python代码了,但是没办法,盛情难却啊,只好硬着头皮上了. ...
- Vue(2) : Vue for Gank.io
简介 最近学习Vue2.0,由于不懂前端知识,学习过程比较缓慢.文档学习过程如下: 通读vue官文 通读vue-router 2中文指南 学习axios 通读vuex官文 数据接口 再次感谢代码家的G ...
- PHP进程之信号捕捉中的declare(ticks=1)
转自:http://blog.csdn.net/gavin_new/article/details/65629223 一. 语句在php中的意义 php中,declare(ticks=n)和regis ...
- [数据处理] LabelEncoder编码
原创博文,转载请注明出处! # LabelEncoder介绍 LabelEncoder是对不连续的数字或文本编号. # LabelEncoder例子 # -*- coding: utf-8 ...
- Jenkins构建持续集成
Jenkins 是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变得可能.现在软件开发追求的是效率以及质量,Jenkins使得自动化成为可能! 亮点 采用shell自定义脚本,控制 ...