题目
思路
通过审题我们知道,每个学生都有语文成绩、数学成绩、英语成绩、总分和学号5个量,所以我们可以用结构体来解。首先创建结构体和结构体数组stu,注意到n<300,开大一些(zong为总分)。代码如下:
struct Student{
int num;
int chinese;
int math;
int english;
int zong;
}stu[310];
然后我们来写比较函数,这个题有些复杂,不过仔细读题还是很好理解的。代码如下:
bool f(Student x,Student y){
if(x.zong==y.zong){
if(x.chinese==y.chinese){
return x.num<y.num;
}else{
return x.chinese>y.chinese;
}
}else{
return x.zong>y.zong;
}
}
接着是主函数里的输入,可以直接在输入for循环中计算每个学生的总分。具体代码如下:
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>stu[i].chinese>>stu[i].math>>stu[i].english;
stu[i].num=i;
stu[i].zong=stu[i].chinese+stu[i].math+stu[i].english;
}
最后是排序和输出(注意输出格式)。代码如下:
sort(stu,stu+n,f);
for(int i=0;i<5;i++){
cout<<stu[i].num+1<<" "<<stu[i].zong<<endl;
}
完整代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct Student{
int num;
int chinese;
int math;
int english;
int zong;
}stu[310];bool f(Student x,Student y){
if(x.zong==y.zong){
if(x.chinese==y.chinese){
return x.num<y.num;
}else{
return x.chinese>y.chinese;
}
}else{
return x.zong>y.zong;
}
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>stu[i].chinese>>stu[i].math>>stu[i].english;
stu[i].num=i;
stu[i].zong=stu[i].chinese+stu[i].math+stu[i].english;
}
sort(stu,stu+n,f);
for(int i=0;i<5;i++){
cout<<stu[i].num+1<<" "<<stu[i].zong<<endl;
}
return 0;
}
新手上路,请多多指教。