L1-030 一帮一 (15分) 团体程序设计天梯赛-练习集(C语言)

L1-030 一帮一 (15分)

题目不是很难,是那种第一眼看上去很麻烦,但仔细看看思路很容易

“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。

输入格式:

输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。

输出格式:

每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。

输入样例:

8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda

输出样例:

Amy Jack
Tom Linda
Bill Maya
Cindy John

AC代码:

#include
typedef struct information
{
     
	int rank;//rank变量表示输入时的排名
	char name[10];
};
int main()
{
     
	int n;
	scanf("%d", &n);
	struct information first[26], second[26];
	//这里定义了first和second的数组,没有用男女来分组,因为不清楚第一个输入的数据是男还是女
	int first_num;//单独存放一下第一个输入数据的性别
	scanf("%d", &first_num);
	getchar();//注意别忘记收掉多余的回车
	gets(first[0].name);
	first[0].rank = 0;
	int f = 1, s = 0;//表示数组应该继续输入的位置的索引
	for (int i = 1; i < n; ++i)
	{
     
		int mid;
		scanf("%d", &mid);
		getchar();
		if (mid == first_num)//如果是第一种性别,就存放在first里
		{
     
			first[f].rank = i;
			gets(first[f].name);
			++f;
		}
		else
		{
     
			second[s].rank = i;
			gets(second[s].name);
			++s;
		}
	}
	f = 0;
	s = 0;
	//初始化一下索引
	int f_r = n / 2 - 1,s_r=n/2-1;
	//定义了两个数组最尾部的索引,也就是成绩最差的
	for (int i = 0; i < n / 2; ++i)//总共有学生总量/2的小组
	{
     
		if (first[f].rank == i)//根据输入学生的名次来进行匹配
		{
     
			printf("%s %s\n", first[f].name, second[s_r].name);
	//如果进入这个分支,说明first[f].rank比second[s].rank排名高
	//first[f].name是目前学习最好的,second[s_r].name是second组学习最差的
			--s_r;//secon数组尾部索引向前推进
			++f;//first数组头部索引向后推进
		}
		else
		{
     
			printf("%s %s\n", second[s].name, first[f_r].name);
			--f_r;
			++s;
		}
	}
	return 0;
}

我用的方法或许有点复杂了,不过希望可以给你带来帮助

你可能感兴趣的:(c语言)