解题思路:显而易见本题可利用结构体将各科成绩、学号等联系在一起,再根据题目给出的排序规则,自定义sort的方式即可。
注意事项:
第一个关键在于sort方式的编写,要先依据总分,总分相同比较语文成绩,若再相同则依据学号排序。
我们需要注意到它给前五名颁发奖学金,但并未指出总人数一定超过5个(*关键),因此在输出时需判断总人数是否超过五个或包括五个,若超过,则for循环5次,否则只需要循环总人数N次。
参考代码:
#include<bits/stdc++.h>
using namespace std;
int N,s,k;
struct stu //定义一个学生结构体
{
int yw;//语文成绩
int sx;//数学成绩
int zf;//总分
int yy;//英语成绩
int xh;//学号
}stus[100005];
bool cmp(stu a,stu b) //sort方式的编写
{
if(a.zf==b.zf)
{
if(a.yw!=b.yw)
{
return a.yw>b.yw;
}
if(a.yw==b.yw)
{
return a.xh<b.xh ;
}
}
return a.zf>b.zf;
}
int main()
{
cin>>N;
for(int i=1;i<=N;i++) stus[i].zf=0;
for(int i=1;i<=N;i++)
{
cin>>stus[i].yw>>stus[i].sx>>stus[i].yy;
stus[i].zf=stus[i].yw+stus[i].sx+stus[i].yy; //将三科成绩加进总分中
stus[i].xh=i; //设置学号
}
sort(stus+1,stus+N+1,cmp); //进行自定义的排序
if(N>=5) //判断是否超过五人
for(int i=1;i<=5;i++)
{
cout<<stus[i].xh<<" "<<stus[i].zf<<endl;
}
else
for(int i=1;i<=N;i++)
{
cout<<stus[i].xh<<" "<<stus[i].zf<<endl;
}
return 0;
}
0.0分
2 人评分