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)的更多相关文章

  1. PAT 甲级 1026 Table Tennis (30 分)(坑点很多,逻辑较复杂,做了1天)

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

  2. PAT 1026 Table Tennis[比较难]

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

  3. PAT 1026. Table Tennis

    A table tennis club has N tables available to the public.  The tables are numbered from 1 to N.  For ...

  4. 1026. Table Tennis (30)

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

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

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

  7. 1026 Table Tennis (30分) 难度不高 + 逻辑复杂 +细节繁琐

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

  8. 【PAT甲级】1026 Table Tennis (30 分)(结构体排序,trick较多)

    题意: 输入一个正整数N(<=10000),表示客户(对)的大小,接着输入N行数据,每行包括一对顾客到场的时间,想要玩的时间,以及是否是VIP客户.接下来输入两个正整数K,M(K<=100 ...

  9. PAT (Advanced Level) 1026. Table Tennis (30)

    情况比较多的模拟题. 交了50发的样子才AC......AC之后我的天空星星都亮了. #include<iostream> #include<cstring> #include ...

随机推荐

  1. 宏里面的(void)0

    在<c标准库>实现assert.h中有一个语句: #define assert(test) ((test)?(void)0 : _Assert(__FILE__":"_ ...

  2. delphi无边框可拖动窗体

    unit UFrmModless; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, ...

  3. video标签常用属性及说明

    video标签常用属性(在标签内部使用) video常用API属性及方法(API属性是供JS调用的,不在video标签元素中直接使用)

  4. android.animation(2) - ValueAnimator的 Interpolator 和 Evaluator

    一.插值器 插值器,也叫加速器:有关插值器的知识,我在<Animation动画详解(二)——Interpolator插值器>中专门讲过,大家可以先看看这篇文章中各个加速器的效果.这里再讲一 ...

  5. linux命令之fuser

    Usage: fuser [ -a | -s | -c ] [ -n SPACE ] [ -SIGNAL ] [ -kimuv ] NAME... [ - ] [ -n SPACE ] [ -SIGN ...

  6. C++之extern关键字

    extern关键字 extern extern关键字的作用就是告诉编译器,它修饰的变量或者函数在别处定义. extern "C" 代码一: cppExample.h #ifndef ...

  7. Oracle 11g安装图文攻略

    一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符. 官方下地址: http://www.ora ...

  8. javac使用笔记

    一般写java都用的IDE,今天临时要测试一下JDK安装好没,就用了一下javac,结果各种不会用 目录 javac -help查到了有javac -sourcepath,他喵的我还以为这是查找sou ...

  9. TCP状态图

    TCP建立关闭连接状态图 MSL:Max segment lifetime最大段存活时间. MSL在RFC1122中规定为两分钟,但是各个操作系统的实现不同,在linux上一般配置MSL???? 处于 ...

  10. 由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端,或打开对每个 Microsoft .NET Framework SDK 文档的跟踪并检查服务器跟踪日志。

    客户端调用WCF的时候报上面的错误,WCF只能序列化基础的数据类型,不能直接序列化SqlParameter类型,需要使用自定义类,然后在WCF服务端转换的方式解决: 自定义类代码如下: using S ...