1. 程式人生 > >Pat(Advanced Level)Practice--1026(Table Tennis)

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

ros turn card 沒有 use gb2312 [] ng- undefined

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;
}


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