PAT 1026 Table Tennis (30)
A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For any pair of players, if there are some tables open when they arrive, they will be assigned to the available table with the smallest number. If all the tables are occupied, they will have to wait in a queue. It is assumed that every pair of players can play for at most 2 hours.
Your job is to count for everyone in queue their waiting time, and for each table the number of players it has served for the day.
One thing that makes this procedure a bit complicated is that the club reserves some tables for their VIP members. When a VIP table is open, the first VIP pair in the queue will have the priviledge to take it. However, if there is no VIP in the queue, the next pair of players can take it. On the other hand, if when it is the turn of a VIP pair, yet no VIP table is available, they can be assigned as any ordinary players.
Input Specification:
Each input file contains one test case. For each case, the first line contains an integer N (<=10000) - the total number of pairs of players. Then N lines follow, each contains 2 times and a VIP tag: HH:MM:SS - the arriving time, P - the playing time in minutes of a pair of players, and tag - which is 1 if they hold a VIP card, or 0 if not. It is guaranteed that the arriving time is between 08:00:00 and 21:00:00 while the club is open. It is assumed that no two customers arrives at the same time. Following the players’ info, there are 2 positive integers: K (<=100) - the number of tables, and M (< K) - the number of VIP tables. The last line contains M table numbers.
Output Specification:
For each test case, first print the arriving time, serving time and the waiting time for each pair of players in the format shown by the sample. Then print in a line the number of players served by each table. Notice that the output must be listed in chronological order of the serving time. The waiting time must be rounded up to an integer minute(s). If one cannot get a table before the closing time, their information must NOT be printed.
Sample Input:
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
3 1
2
Sample Output:
08:00:00 08:00:00 0
08:01:30 08:01:30 0
08:02:00 08:02:00 0
08:12:00 08:16:30 5
08:10:00 08:20:00 10
20:50:00 20:50:00 0
20:51:00 20:51:00 0
20:52:00 20:52:00 0
3 3 2
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <queue>
using namespace std;
#define INF 21*3600
#define MAX 10000
int CurrTime[MAX+5];
int numTable[MAX+5];//桌子被玩的次数
//用户的结构体
struct Player
{
int startTime;//到达的时间
int waitTime;//等待的时间
int playTime;//玩耍的时间
}VipPlayer[MAX+5],OriPlayer[MAX+5];
int n;//n个人
int k,m;//桌子的数量,vip桌子的数量
int cmp(Player a,Player b) {return a.startTime<b.startTime;}//比较函数,快速排序
int VipNumber;//会员的人数
int OriNumber;//普通的人数
bool vipTag[MAX+5];//标记vip桌子
void printTime(int time)
{
int hh,mm,ss;
ss=time%60;
mm=time/60%60;
hh=time/3600;
printf("%02d:%02d:%02d ",hh,mm,ss);
}
int main()
{
scanf("%d",&n);
int hh,mm,ss,time,tag;
VipNumber=1;OriNumber=1;
for(int i=1;i<=n;i++)
{
scanf("%d:%d:%d",&hh,&mm,&ss);
int sum=hh*3600+mm*60+ss;
scanf("%d%d",&time,&tag);
if(time>120)//如果超过两个小时,要进行限制
time=120;
if(hh>=21) continue;//如果超出营业时间,要进行限制
if(tag)//如果是vip
{
VipPlayer[VipNumber].startTime=sum;
VipPlayer[VipNumber].waitTime=0;
VipPlayer[VipNumber++].playTime=time;
}
else//如果不是
{
OriPlayer[OriNumber].startTime=sum;
OriPlayer[OriNumber].waitTime=0;
OriPlayer[OriNumber++].playTime=time;
}
}
scanf("%d%d",&k,&m);//输入桌子数量和vip桌子数量
int xx;memset(vipTag,0,sizeof(vipTag));
memset(numTable,0,sizeof(numTable));
for(int i=1;i<=m;i++)
{
scanf("%d",&xx);
vipTag[xx]=1;
}
//对普通和vip进行排序
sort(VipPlayer+1,VipPlayer+VipNumber,cmp);
sort(OriPlayer+1,OriPlayer+OriNumber,cmp);
int i=1,j=1;
int index=-1;
for(int i=1;i<=k;i++)
CurrTime[i]=8*3600;
while(i<VipNumber||j<OriNumber)
{
int minTime=INF,VipTime=INF,OriTime=INF;
for(int p=1;p<=k;p++)
{
if(CurrTime[p]<minTime)
{
minTime=CurrTime[p];
index=p;
}
}
if(i>VipNumber&&j>OriNumber)
break;
if(i<VipNumber) {VipTime=max(VipPlayer[i].startTime,minTime);}
if(j<OriNumber) {OriTime=max(OriPlayer[j].startTime,minTime);}
bool VipServe=true;
if(VipTime>OriTime&&OriTime<21*3600) {VipServe=false;}
else if(OriTime>VipTime&&VipTime<21*3600) {VipServe=true;}
else if(OriTime==VipTime&&OriTime<21*3600)
{
if(vipTag[index]||(!vipTag[index]&&VipPlayer[i].startTime<OriPlayer[j].startTime))
VipServe=true;
else
VipServe=false;
}
else if(OriTime==21*3600&&VipTime==21*3600)
{
break;
}
//判断当前桌子可以为谁服务
if(VipServe)
{
if(!vipTag[index])
{
for(int p=1;p<=k;p++)
{
if(vipTag[p]&&CurrTime[p]==minTime)
{
index=p;
}
}
}
VipPlayer[i].waitTime=VipTime;
CurrTime[index]=VipTime+VipPlayer[i].playTime*60;
numTable[index]++;
printTime(VipPlayer[i].startTime);
printTime(VipPlayer[i].waitTime);
printf("%d\n",(VipPlayer[i].waitTime-VipPlayer[i].startTime+30)/60);
i++;
}
else
{
OriPlayer[j].waitTime=OriTime;
CurrTime[index]=OriTime+OriPlayer[j].playTime*60;
numTable[index]++;
printTime(OriPlayer[j].startTime);
printTime(OriPlayer[j].waitTime);
printf("%d\n",(OriPlayer[j].waitTime-OriPlayer[j].startTime+30)/60);
j++;
}
}
printf("%d",numTable[1]);
for(int i=2;i<=k;i++)
printf(" %d",numTable[i]);
printf("\n");
return 0;
}
PAT 1026 Table Tennis (30)的更多相关文章
- PAT 甲级 1026 Table Tennis (30 分)(坑点很多,逻辑较复杂,做了1天)
1026 Table Tennis (30 分) A table tennis club has N tables available to the public. The tables are ...
- PAT 1026 Table Tennis[比较难]
1026 Table Tennis (30)(30 分) A table tennis club has N tables available to the public. The tables ar ...
- PAT 1026. Table Tennis
A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For ...
- 1026. Table Tennis (30)
题目如下: A table tennis club has N tables available to the public. The tables are numbered from 1 to N. ...
- 1026 Table Tennis (30)(30 分)
A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For a ...
- 1026 Table Tennis (30分)
A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For a ...
- 1026 Table Tennis (30分) 难度不高 + 逻辑复杂 +细节繁琐
题目 A table tennis club has N tables available to the public. The tables are numbered from 1 to N. Fo ...
- 【PAT甲级】1026 Table Tennis (30 分)(结构体排序,trick较多)
题意: 输入一个正整数N(<=10000),表示客户(对)的大小,接着输入N行数据,每行包括一对顾客到场的时间,想要玩的时间,以及是否是VIP客户.接下来输入两个正整数K,M(K<=100 ...
- PAT (Advanced Level) 1026. Table Tennis (30)
情况比较多的模拟题. 交了50发的样子才AC......AC之后我的天空星星都亮了. #include<iostream> #include<cstring> #include ...
随机推荐
- atitit.loading的设计与实现控件选型attilax 总结
atitit.loading的设计与实现控件选型attilax 总结 1. Percentage Loader(推荐) 1 1.1. 起始百分比::调整 progress 1 2. CSS3 Loa ...
- atitit.解决SyntaxError: missing ] after element list"不个object 挡成个str eval ....
atitit.解决SyntaxError: missing ] after element list"不个object 挡成个str eval .... 1. 原因::: 不个object ...
- java synchronized究竟锁住的是什么
刚学java的时候,仅仅知道synchronized一个线程锁.能够锁住代码,可是它真的能像我想的那样,能够锁住代码吗? 在讨论之前先看一下项目中常见关于synchronized的使用方法: publ ...
- TIME_WAIT详解
1.TCP四次挥手关闭链接过程 2.TIME_WAIT的产生条件主动关闭方在发送四次挥手的最后一个ACK会变为TIME_WAIT状态,保留此状态的时间为两个MSL 3.TIME_WAIT两个MSL的作 ...
- jquery 获取绑定事件
在1.8.0版本之前,我们要想获取某个DOM绑定的事件处理程序可以这样: 1 $.data(domObj,'events');//或者$('selector').data('events') 而从1. ...
- linux服务器 IE中ico 不能正常显示
问题: mime_type: image/vnd.microsoft.icon 的,但发现在 IE 下面,直接打开 icon 的地址,图标不能正常显示 1.将ico放在windows服务器上,直接访问 ...
- lua获取喜马拉雅音频地址
参考此文http://blog.csdn.net/zjg555543/article/details/39177971 在Linux下可以直接运行 #!/usr/bin/lua5. --需要luacu ...
- ubuntu 12.04下apache 配置家目录地址
apache2 最在搞前端相关的东西,上一次也记录了 Linux 下 LAMP环境的搭建,现在记录一下如果改变 apache2 的家目录地址该怎么做,改那个配置文件 修改配置文件 /etc/apach ...
- rp2836 网卡以及串口与接插件位置关系
P3 ETH1 P6 ETH0 P7 /dev/ttyS3 调试口 P13-1 /dev/ttyS2 rs485+ P13-2 /dev/ttyS2 rs485- P1 ...
- linux - camera capture
//cut a picture#include <stdio.h>#include <stdlib.h>#include <string.h>#include &l ...