PTA-团体天梯赛-L1-049 天梯赛座位分配 (20 分)

@致“真香”“各种打脸”的小伙伴们嘤嘤嘤

时隔不久我又发博客啦~~~
这次我想废话几句嘛,这次做这道座位分配的题目我是真的各种打脸啊(脸都肿了QAQ),difficult还是在的嘛,level也还是在的嘛,实践告诉我们不要随便瞎说话!!!说话之前要经过大脑的思考!!!所以写一篇博客来纪念一下啦~

题目精简描述:本题要求我们根据已知的学校数量和各个学校的队伍数量进行座位的分配
注意题目的重点要求:同一所学校的所有队员不能相邻~~~

我第一眼看到这个题目的时候没啥思路:稍加思索,总结出这几个方面:
1.设定数组的意义何在:这里我设定了两个数组:
一个数组team表示每所高校的参赛人数,一个数组Number表示每位参赛选手的座位号。
重点来了!!!
Number数组的下标代表的是每位参赛选手的座位号,而其数组中储存的信息是每位参赛选手的所属学校,也就是说假如有n所学校,那么Number数组中的值就是1~n依次循环下去

2.还有一个需要注意的方面是如果我们遇到第一所学校参赛人数最多,但是这个时候参赛学校n不为1,我们在后面排列第一所学校选手剩余的座位号的时候的临界情况:隔位就坐时,队伍的第一位选手开始排实际上不需要隔位就坐,因为在他的前面一个选手并不是与他同一所学校的选手

3.最后一点需要注意的是打印时:我们打印的是Number数组的下标!!!那些什么换行啊打印空格啊太平常的问题这里我就不说啦~那是pta的日常~嘤嘤嘤

	最后简述一下代码的主要部分:
	while (1)
	{
		FOR(i, 1, n)
			if (team[i] > 0)//当前队伍人数仍大于0
			{
				number[cnt++] = i;//将所属学校存入number的数组中,cnt代表其座位号
				team[i]--;
			}
		temp = n;
		FOR(i, 1, n)
			if (!team[i])//当前有学校队伍已经编排完毕
				temp--;
		if (!temp)//所有队伍已经编排完毕,退出循环
			break;
		if (temp == 1)//只剩余一支队伍,那我们开始隔位就坐
			cnt++;
		if (team[1] && temp == 1 && n != 1 && !flag)
		//这个地方就是我上面说的第二点需要注意的情况啦,因为我们上面在只剩余一支队伍的时候已经将cnt++了一次,
		而且这是本次首次遇到这种情况,再说一次!!前面那位参赛选手与本次需要编排的参赛选手不是同一所学校的!
		所以不需要隔位就坐!!!
		{
			cnt--;
			flag = 1;
		}
	}

好啦,废话就说到这里,直接上代码部分啦

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

#define FOR(i, a, b) for(int i = a; i <= b; i++)
#define ROF(i, a, b) for(int i = a; i >= b; i--)
#define mst(a) memset(a, 0, sizeof(a))
#define mstn(a, n) memset(a, n, sizeof(a))
typedef long long ll;
const int N = 1e5 + 10;
const int M = 1e2 + 10;

int number[N];
int team[M];
int n;
int cnt = 1;
int temp;
int flag = 0;

int main()
{
	scanf("%d", &n);
	FOR(i, 1, n)
	{
		scanf("%d", &team[i]);
		team[i] *= 10;
	}
	while (1)
	{
		FOR(i, 1, n)
			if (team[i] > 0)
			{
				number[cnt++] = i;
				team[i]--;
			}
		temp = n;
		FOR(i, 1, n)
			if (!team[i])
				temp--;
		if (!temp)
			break;
		if (temp == 1)
			cnt++;
		if (team[1] && temp == 1 && n != 1 && !flag)
		{
			cnt--;
			flag = 1;
		}
	}
	FOR(i, 1, n)
	{
		int s = 0;
		printf("#%d\n", i);
		FOR(j, 1, cnt - 1)
		{
			if (number[j] == i)
			{
				printf("%d", j);
				s++;
				if (s % 10 == 0)
					printf("\n");
				else
					printf(" ");
			}
		}
	}
	system("pause");
	return 0;
}

谢谢大家~~~~~

你可能感兴趣的:(PTA)