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

Pat1026代码

题目描写叙述:

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

这个排序模拟题。真是延续了PAT坑人的一贯作风啊;

參考了网上的一些代码,下面几点须要注意:

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

AC代码:

#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

class Player
{
	public:
		int arrive;//arrive time
		int vip;//vip flag
		int playtime;//the time player play
		bool operator<(const Player r)const
		{
			return arrive<r.arrive;
		}
};

class Table
{
	public:
		int freetime;//the time table can be used
		int vip;//vip falg
		int ID;//the number of table
		int num;//the number of players the table serve
		bool operator<(const Table r)const
		{
			if(freetime!=r.freetime)
				return freetime<r.freetime;
			else
				return ID<r.ID;
		}
};

bool cmp(Table l,Table r)
{
	return l.ID<r.ID;
}

int main(int argc,char *argv[])
{
	Table t[105];
	vector<Player> p;
	vector<Player> waiting;
	int n,i,j;
	int k,m;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		int h,m,s;
		Player temp;
		scanf("%d:%d:%d %d %d",&h,&m,&s,&temp.playtime,&temp.vip);
		temp.arrive=h*3600+m*60+s;
		if(temp.playtime>120)
			temp.playtime=120;
		temp.playtime*=60;
		if(temp.arrive>=21*60*60||temp.arrive<8*60*60)
			continue;
		p.push_back(temp);
	}
	scanf("%d%d",&k,&m);
	for(i=1;i<=k;i++)
	{
		t[i].ID=i;
		t[i].vip=0;
		t[i].num=0;
		t[i].freetime=0;
	}
	for(i=0;i<m;i++)
	{
		int index;
		scanf("%d",&index);
		t[index].vip=1;
	}
	int timer=0;
	int cur=0;
	sort(p.begin(),p.end());
	sort(t+1,t+1+k);
	while(timer<21*60*60)
	{
		for(;cur<p.size();cur++)
		{
			if(p[cur].arrive<=timer)//假设此时没有空暇球桌,而且在timer
				waiting.push_back(p[cur]);//之前到达,player需在队列里等待
			else
				break;
		}
		if(!waiting.size())//假设等待对列为空。即此时有剩余球桌
		{
			if(cur<p.size())
			{
				timer=p[cur].arrive;
				for(i=1;i<=k;i++)//把无人使用球桌的freetime更新为timer
				{
					if(t[i].freetime<=timer)
						t[i].freetime=timer;
				}
				waiting.push_back(p[cur++]);
			}
			else
				break;
		}
		vector<Player>::iterator it;//find the first vip player in the queue
		for(it=waiting.begin();it!=waiting.end();it++)
			if(it->vip)
				break;
		int vipplayer=0;
		if(it!=waiting.end())
			vipplayer=1;
		int viptable=-1;//find the first vacant vip table
		for(i=1;i<=k&&t[i].freetime==timer;i++)
		{
			if(t[i].vip)
			{
				viptable=i;
				break;
			}
		}
		if(viptable>=1&&vipplayer)//队列中有vip客户,且有空暇vip桌子
		{
			int arrive=it->arrive;
			printf("%02d:%02d:%02d %02d:%02d:%02d %d\n",arrive/3600,
		(arrive%3600)/60,arrive%60,timer/3600,(timer%3600)/60,timer%60,
		         (timer-it->arrive+30)/60);
			t[viptable].freetime=timer+it->playtime;
			t[viptable].num++;
			waiting.erase(it);
		}
		else
		{
			int arrive=waiting[0].arrive;
			 printf("%02d:%02d:%02d %02d:%02d:%02d %d\n",arrive/3600,
			 (arrive%3600)/60,arrive%60,timer/3600,(timer%3600)/60,timer%60,
	                 (timer-arrive+30)/60);
			 t[1].freetime=timer+waiting[0].playtime;
			 t[1].num++;
			 waiting.erase(waiting.begin());
		}
		sort(t+1,t+1+k);//对桌子的空暇时间进行排序,否则对ID进行排序
		timer=t[1].freetime;//则每次都是第一个桌子先被使用
	}
	sort(t+1,t+1+k,cmp);//恢复桌子的序号
	printf("%d",t[1].num);
	for(i=2;i<=k;i++)
		printf(" %d",t[i].num);
	printf("\n");

	return 0;
}

时间: 2024-11-09 00:40:18

Pat(Advanced Level)Practice--1026(Table Tennis)的相关文章

1002 A+B for Polynomials (PAT (Advanced Level) Practice)

This time, you are supposed to find A+B where A and B are two polynomials. Input Specification: Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial: K N?1?? a?N?1???? N?2?? a?N?2?

PAT (Advanced Level) Practice 1011 World Cup Betting (20 分)

With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excited as the best players from the best teams doing battles for the World Cup trophy in South Africa. Similarly, football betting fans were putting their

PAT (Advanced Level) Practice 1068 Find More Coins

题解 01背包板子 + 记录路径.这次的记录路径比较特殊,要从多组解中找到一组由尽量小价值的硬币组成的解.所以不能利用一维数组记录路径,path[目前重量] = 物品序号,因为这样最后只能记录一个可能符合或不符合要求解.所以应该利用二维数组记录路径,path[ 物品序号 ][ 目前重量 ] = 1,这样可以记录多组解.因为要求为找到最小的一组解,所以先将拥有的硬币从大到小排序,以便于进行01背包时,可以从大到小更新解. 代码 #include<bits/stdc++.h> using name

1026 Table Tennis (30 分)

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 sma

Pat(Advanced Level)Practice--1043(Is It a Binary Search Tree)

Pat1043代码 题目描述: A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the node's key. The right subtree of a node contains only nodes

Pat(Advanced Level)Practice--1044(Shopping in Mars)

Pat1044代码 题目描述: Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diamond has a value (in Mars dollars M$). When making the payment, the chain can be cut at any position for only once and some of the diam

PAT (Advanced Level) 1093. Count PAT&#39;s (25)

预处理每个位置之前有多少个P,每个位置之后有多少个T. 对于每个A,贡献的答案是这个A之前的P个数*这个A之后T个数. #include<cstdio> #include<cstring> long long MOD=1e9+7; const int maxn=1e5+10; long long dp1[maxn],dp2[maxn]; char s[maxn]; int main() { scanf("%s",s); memset(dp1,0,sizeof d

PAT (Advanced Level) 1055. The World&#39;s Richest (25)

排序.随便加点优化就能过. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<map> #include<queue> #include<string> #include<stack> #include<vector> using names

Pat(Advanced Level)Practice--1018(Public Bike Management)

Pat1018代码 题目描述: There is a public bike service in Hangzhou City which provides great convenience to the tourists from all over the world. One may rent a bike at any station and return it to any other stations in the city. The Public Bike Management C

Pat(Advanced Level)Practice--1076(Forwards on Weibo)

Pat1076代码 题目描述: Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may follow many other users as well. Hence a social network is formed with followers relations. When a user makes a post on Weibo, all hi