一、编码前的准备
1、读题目
题目描述
现有 N 名同学参加了期末考试,并且获得了每名同学的信息:姓名(不超过 8 个字符的仅有英文小写字母的字符串)、语文、数学、英语成绩(均为不超过 150 的自然数)。总分最高的学生就是最厉害的,请输出最厉害的学生各项信息(姓名、各科成绩)。如果有多个总分相同的学生,输出靠前的那位。
输入格式
第一行输入一个正整数 N,表示学生个数。
第二行开始,往下 N 行,对于每一行首先先输入一个字符串表示学生姓名,再输入三个自然数表示语文、数学、英语的成绩。均用空格相隔。
输出格式
输出最厉害的学生。
2、分析题目
1、问:何为最厉害的学生?
1、答:总分最高的学生就是最厉害的,请输出最厉害的学生各项信息(姓名、各科成绩)。
2、问:如果总分相同,该怎么排?
2、答:如果有多个总分相同的学生,输出靠前的那位,也就是说,总分相同,谁先输入,输入谁
3、输出样例&输入样例
输入输出样例
输入 #1
3 senpai 114 51 4 lxl 114 10 23 fafa 51 42 60
输出 #1
senpai 114 51 4
4、数据范围
数据保证,1≤N≤1000,姓名为长度不超过 8 的字符串,语文、数学、英语成绩均为不超过 150 的自然数。
5、数据准备
1、结构体students
1.1、srting name;——>储存名字
1.2、int c,m,e;——>保存分数
1.3、int sum;——>保存总分
1.4、int ID;——>保存序号
2、int n;
3、students a[1010];
二、编程
1、基础框架
#include<bits/stdc++.h>
using namespace std;
struct students{
string name;
int c,m,e;
int sum;
int ID;
};
students a[1010]
int main(){
int n;
cin>>n;
return 0;
}
#include<bits/stdc++.h> C++的特殊头文件,包含数学库,字符串等常用的函数与方法
2、输入
我们要把他们一个一个的输入近数组a中,那么要用for循环
for(int i=0;i<n;i++){
cin>>a[i].name>>a[i].c>>a[i].m>>a[i].e;
a[i].sum=a[i].c+a[i].m+a[i].e;
a[i].ID=i;
}
我们通过循环输入学生的名字,语数英成绩,并且直接算出sum与ID,方便了后续排序
3、排序
我这里使用排序函数sort,并加上二级排序函数cmp进行对学生排序
bool cmp(students x,students y){
if(x.sum != y.sum)return x.sum>y.sum;
return x.ID<y.ID;
}
......
sort(a,a+n,cmp);
问:为什么排ID时要用小于?
答:因为越靠前越小,所以要用小于,因为在输入ID时是之间用的循环变量i,所以I越小,输入的越靠前。
4、输出
out<<a[0].name<<" "<<a[0].Chiese<<" "<<a[0].Math<<" "<<a[0].Englishi;
输出最前面的,就是索引0
5、完全代码
#include<bits/stdc++.h>
using namespace std;
struct students{
string name;
int c,m,e;
int sum=0;
int ID;
};
bool cmp1(students x,students y){
if(x.sum != y.sum)return x.sum>y.sum;
return x.ID<y.ID;
}
students a[1010];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i].name >> a[i].c >>a[i].m >>a[i].e;
a[i].sum = a[i].c + a[i].m + a[i].e;
a[i].ID=i;
}
sort(a,a+n,cmp1);
cout<<a[0].name<<" "<<a[0].c<<" "<<a[0].m<<" "<<a[0].e;
return 0;
}
6、检测

三、总结
本题我们运用了结构体的知识,定义了一个学生的信息,并进行排序,在二级排序中,有一个易错点,也就是ID的排序,所以要认真思考,不要出现逻辑错误哦。
799

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



