“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。
输入格式:
输入第一行给出正偶数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
问题分析
一旦给出正偶数n有多少个男同学多少个女同学他们的数量就确定了,所以我们定义一个结构体表示一个学习小组,在学习小组中的人满足这样一个规律那就是男生在男生中的名次加上女生在女生中的名次等于人数的一半。所以将他们放到学习小组时满足这个规律就行了,之后输出小组的顺序是按找组内名次最高的学生来排序的所以需要排序,排完序然后组内谁名次靠前先输出谁。
代码我已经注释了,详细的代码内看。
代码实现
#include<stdio.h>
#include<string.h>
struct student{
char mname[10];
int msex;
int mpaiming;
char fname[10];
int fsex;
int fpaiming;
int max;
};
int main(){
//对于学生来说在给出正偶数n时已经给出了男女学生的个数
int n,countm=0,countf=0;
struct student stu[25];
scanf("%d",&n);
for(int i=0;i<n;i++){
char name[10];
int sex;
scanf("%d %s",&sex,name);
if(sex==0){//写成这样是按照女生的次序决定小组的次序了,然而小组次序由小组内名次最高的同学确定。
strcpy(stu[countf].fname,name);//countf用来数女生
stu[countf].fsex=sex;
stu[countf].fpaiming=i;
countf++;
}else{
strcpy(stu[n/2-1-countm].mname,name);//countn用来数男生
stu[n/2-1-countm].msex=sex;
stu[n/2-1-countm].mpaiming=i;
countm++;
}
}
for(int i=0;i<countm;i++){//将小组内名次最高的学生名词找出来
stu[i].max=stu[i].mpaiming>stu[i].fpaiming?stu[i].fpaiming:stu[i].mpaiming;
}
for(int i=0;i<countm-1;i++){//按照名次最高的学生的名次进行排序
for(int j=i+1;j<countm;j++){
if(stu[i].max>stu[j].max){
struct student t=stu[i];
stu[i]=stu[j];
stu[j]=t;
}
}
}
for(int i=0;i<countm;i++){
if(stu[i].mpaiming>stu[i].fpaiming){
printf("%s %s\n",stu[i].fname,stu[i].mname);//先输出名次较高的同学
}else{
printf("%s %s\n",stu[i].mname,stu[i].fname);
}
}
return 0;
}
本文介绍了一种算法,用于自动为班级中的学生分配一帮一学习小组,确保每组由成绩相对较高和较低的学生组成,并且考虑到性别平衡。
1677

被折叠的 条评论
为什么被折叠?



