题意自己理解了,主要是两个队列维护,一个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的更多相关文章

  1. uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列

    题目很简单,给一个队列以及文件的位置,然后一个一个检查,如果第一个是优先级最高的就打印,否则放到队列后面,求所要打印的文件打印需要花费多长时间. 这里我用数组模拟队列实现,考虑到最糟糕的情况,必须把数 ...

  2. PAT 甲级 1026 Table Tennis(模拟)

    1026. Table Tennis (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A table ...

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

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

  5. Codeforces Round #304 (Div. 2) C. Soldier and Cards —— 模拟题,队列

    题目链接:http://codeforces.com/problemset/problem/546/C 题解: 用两个队列模拟过程就可以了. 特殊的地方是:1.如果等大,那么两张牌都丢弃 : 2.如果 ...

  6. Pat(Advanced Level)Practice--1026(Table Tennis)

    Pat1026代码 题目描写叙述: A table tennis club has N tables available to the public. The tables are numbered ...

  7. PAT甲级1026. Table Tennis

    PAT甲级1026. Table Tennis 题意: 乒乓球俱乐部有N张桌子供公众使用.表的编号从1到N.对于任何一对玩家,如果有一些表在到达时打开,它们将被分配给具有最小数字的可用表.如果所有的表 ...

  8. 1026. Table Tennis (30)

    题目如下: A table tennis club has N tables available to the public. The tables are numbered from 1 to N. ...

  9. PAT 1026 Table Tennis[比较难]

    1026 Table Tennis (30)(30 分) A table tennis club has N tables available to the public. The tables ar ...

随机推荐

  1. Srping整合EhCache

    引入的Jar包如下:

  2. 转:CentOS 7使用nmcli配置双网卡聚合LACP

    进入CentOS 7以后,网络方面变化比较大,例如eth0不见了,ifconfig不见了,其原因是网络服务全部都由NetworkManager管理了,下面记录下今天下午用nmcli配置的网卡聚合,网络 ...

  3. IOS-Quartz2D

    一.画基本图形 // // BWView.m // IOS_0221_Quartz2D画矩形 // // Created by ma c on 16/2/21. // Copyright © 2016 ...

  4. ffmpeg 命令小记

    指定格式转码 ffmpeg -i 1.mp4 -c:v libx264 -c:a aac -y 1.flv 等时长转为m3u8格式 ffmpeg -i 1.avi -c:v libx264 -c:a ...

  5. arch初认识

    在这里下载最新的iso镜像,一个iso里面已经包括了32和64位. 来者不善. 进去后竟然是进入字符界面,并且给各位留了一个install.txt,果然..==! 好吧,粗略看下install.txt ...

  6. iOS 开发经验总结

    iOS 开发经验总结http://www.cocoachina.com/ios/20170216/18699.html 1.cocoa pods 常用的framework 1 2 3 4 5 6 7 ...

  7. flask中过滤器的使用

    过滤器 过滤器的本质就是函数.有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化.运算等等,而在模板中是不能直接调用 Python 中的某些方法,那么这就用到了过滤器. 使用方 ...

  8. Spring警告: Could not load driverClass com.mysql.jdbc.Driver(待解决)

    在一个Spring项目中,新建了一个外部属性文件db.properties,在xml文件中利用${}来引用db.properties文件里面的属性. beans-properties.xml: < ...

  9. Linux:网络配置

    网络配置 1.网卡配置 vim /etc/sysconfig/network-scripts/ifcfg-eth0 1DEVICE=eth0 2 HWADDR=00:0C:29:93:41:2B 3 ...

  10. 转:java c/s tomcat 三层架构

    概述在c/s结构的发展历程中,产生了两层c/s结构和三层c/s结构之分.在两层c/s结构中,在信息管理系统的管理上主要分为客户端和数据库服务器. 缺点有两个: 1)开销高昂.在两层c/s结构中,为了维 ...