我们在ACM的题目中已经了解了什么是ACM了,ACM还是很残酷的了(ಥ _ ಥ),那么现在你就要解决一个ACM最简单的题了,简单到省赛和区域赛都不会出这种简单的题。ls很强,即使每年都在ACM这个大坑里,但是他依旧关心自己的排名。但是排名规则真的很令人烦恼,因为它是按平均分排的并且他们学习的科目数量是不一定的。所以你的任务就来了,ls的班里有n名同学,每个同学有3门课程,现在你要根据他们的成绩总和从大到小排名如果成绩相同则按他们名字的字典序(字典序当然就是字典的顺序啦)排名。
Input
第1行:一个数n,表示ls所在班里的学生的数量(2 <= N <= 100)第2 - N+1行,第一个数为第i个同学的课程的数量,接下来3个数对应3门课程的成绩(0<=m[i]<=100),接下来为一个字符串s表示第i个同学的名字(字符串的长度<=30且只是字母保证不会出现相同的名字)。
Output
输出他们排名后的结果。
Sample Input 1
3
100 100 100 ls
99 99 100 kt
99 100 99 ksgggggggggggggg
Sample Output 1
ls 300 ksgggggggggggggg 298 kt 298
#include<stdio.h>
#include<string.h>
struct student
{
int f[4];
char name[35];
int sum;
}stu[110],t;
int main()
{
int i,n,j;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d %d %d %s",&stu[i].f[0],&stu[i].f[1],&stu[i].f[2],&stu[i].name);
for(i=0;i<n;i++)
stu[i].sum=stu[i].f[0]+stu[i].f[1]+stu[i].f[2];
for(j=1;j<n;j++)
for(i=0;i<n-j;i++)
{
if(stu[i].sum<stu[i+1].sum)
{
t=stu[i];
stu[i]=stu[i+1];
stu[i+1]=t;
}
else if(stu[i].sum==stu[i+1].sum)
{
if(strcmp(stu[i].name,stu[i+1].name)>0)
{
t=stu[i];
stu[i]=stu[i+1];
stu[i+1]=t;
}
}
}
for(i=0;i<n;i++)
printf("%s %d\n",stu[i].name,stu[i].sum);
return 0;
}
当需要声明多个变量的时候 运用结构体就可能会更方便。
本题中,需要输出总成绩的最大值,同时在最大值后面需要输出姓名。如果不采用结构体,用单个数组来储存数据,把成绩的最大值输出后在输出对应人的姓名
就会很麻烦。所以,使用结构体,把成绩和姓名都放在一个结构体变量里面,需要输出时,直接像输出int型变量一样输出结构体变量就可以了。