解题思路:显而易见本题可利用结构体将各科成绩、学号等联系在一起,再根据题目给出的排序规则,自定义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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复