1026. Table Tennis (30)

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct node
{
	int arriving, playing, hour, minute, second;
};

int table[110], usercount[110];

int cmp(node n1, node n2)
{
	return n1.arriving < n2.arriving;
}

int main()
{
	int n;
	scanf("%d", &n);

	vector<node> v[2];
	int i, tag;
	node nod;

	for(i = 1; i <= n; i++)
	{
		scanf("%d:%d:%d %d %d", &nod.hour, &nod.minute, &nod.second, &nod.playing, &tag);

		nod.arriving = nod.hour * 3600 + nod.minute * 60 + nod.second;
		if(nod.arriving >= 21 * 3600)
		{
			continue;
		}

		if(nod.playing > 120)
		{
			nod.playing = 120;
		}
		nod.playing *= 60;

		v[tag].push_back(nod);
	}
	
	int k, m;
	scanf("%d%d", &k, &m);

	int viptable;
	for(i = 1; i <= m; i++)
	{
		scanf("%d", &viptable);
		table[viptable] = 1;
	}

	int former[110], flag[110];
	for(i = 1; i <= k; i++)
	{
		former[i] = 8 * 3600;
		flag[i] = 1;
	}
	
	int size[2];
	for(i = 0; i <= 1; i++)
	{
		size[i] = v[i].size();

		if(size[i] > 0)
		{
			sort(v[i].begin(), v[i].end(), cmp);
		}
	}

	int index[2] = {0, 0}, mintime[2], minindex[2], res, tableindex, wait, enter, whileflag;
	node cur[2];

	while(1)
	{
		whileflag = 0;
		for(i = 0; i <= 1; i++)
		{
			if(index[i] < size[i])
			{
				whileflag = 1;
				cur[i] = v[i][index[i]];
			}
		}

		if(whileflag == 0)
		{
			break;
		}

		for(i = 0; i <= 1; i++)
		{
			mintime[i] = 10000000;
			minindex[i] = -1;
		}

		for(i = 1; i <= k; i++)
		{
			if(flag[i] == 1)
			{
				if(former[i] < mintime[0])
				{
					mintime[0] = former[i];
					minindex[0] = i;
				}

				if(table[i] == 1 && former[i] < mintime[1])
				{
					mintime[1] = former[i];
					minindex[1] = i;
				}
			}
		}

		if(minindex[0] == -1)
		{
			break;
		}

		if(index[0] == size[0])
		{
			res = 1;
		}
		else if(index[1] == size[1])
		{
			res = 0;
		}
		else
		{
			for(i = 0; i <= 1; i++)
			{
				cur[i] = v[i][index[i]];
			}

			if(cur[1].arriving < cur[0].arriving)
			{
				res = 1;
			}
			else
			{
				if(cur[0].arriving >= mintime[0] || cur[1].arriving >= mintime[0])
				{
					res = 0;
				}
				else
				{
					if(mintime[0] == mintime[1])
					{
						res = 1;
					}
					else
					{
						res = 0;
					}
				}
			}
		}

		nod = cur[res];
		tableindex = minindex[0];

		if(res == 1 && mintime[1] <= nod.arriving)
		{
			tableindex = minindex[1];
		}

		printf("%02d:%02d:%02d ", nod.hour, nod.minute, nod.second);

		if(former[tableindex] < nod.arriving)
		{
			enter = nod.arriving;
			wait = 0;
			former[tableindex] = nod.arriving + nod.playing;
		}
		else
		{
			enter = former[tableindex];
			wait = former[tableindex] - nod.arriving;
			former[tableindex] += nod.playing;
		}

		if(wait % 60 >= 30)
		{
			wait = wait / 60 + 1;
		}
		else
		{
			wait /= 60;
		}

		nod.hour = enter / 3600;
		nod.minute = (enter - nod.hour * 3600) / 60;
		nod.second = enter % 60;

		printf("%02d:%02d:%02d %d\n", nod.hour, nod.minute, nod.second, wait);

		usercount[tableindex]++;
		index[res]++;

		if(former[tableindex] >= 21 * 3600)
		{
			flag[tableindex] = 0;
		}
	}

	for(i = 1; i <= k; i++)
	{
		if(i > 1)
		{
			printf(" ");
		}

		printf("%d", usercount[i]);
	}

	printf("\n");

	system("pause");
	return 0;
}

 

posted on 2025-11-23 16:59  王景迁  阅读(4)  评论(0)    收藏  举报

导航