题目描述
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。
期末,每个学生都有3门课的成绩:语文、数学、英语。
先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,
如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,
这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,
最后按排名顺序输出前五名名学生的学号和总分。
注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。
例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:
7 279
5 279
这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。
这两名同学的总分都是279 (总分等于输入的语文、数学、英语三科成绩之和),
但学号为7的学生语文成绩更高一些。
如果你的前两名的输出数据是:
5 279
7 279
则按输出错误处理。
输入格式
输入文件包含n+1行:
第1行为一个正整数n,表示该校参加评选的学生人数。
第2到n+1行,每行有3个用空格隔开的数字,每个数字都在0到100之间,
第j行的3个数字依次表示学号为j-1的学生的语文、数学、英语的成绩。
每个学生的学号按照输入顺序编号为1~n (恰好是输入数据的行号减1)。
所给的数据都是正确的,不必检验。
输出格式
输出文件共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。
数据范围
6≤n≤300
输入样例:
6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98
输出样例:
6 265
4 264
3 258
2 244
1 237
算法1
主要考察熟练使用比较函数重载和stl的排序函数
使用一个数组 vector记录 总成绩 语文成绩和序号 三个需要比较的元素
然后调用stl的比较排序函数,重载比较函数 先比较总成绩 在比较语文成绩 最后比较序号
参考文献
C++ 代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> vv;
int n;
//重载比较函数 先比较总成绩 在比较语文成绩 最后比较序号
bool cmp(const vector<int>& a,const vector<int>& b){
if(a[0] >b[0]) return true;
else if(a[0]==b[0] && a[1] > b[1]) return true;
else if(a[0]==b[0] && a[1] == b[1] && a[2] <b[2]) return true;
return false;
}
int main(){
cin >> n;
for(int i = 1; i <=n;i++){
int a ,b,c;
cin >> a >>b>>c;
int total = a+b+c;
vector<int> v{total,a,i};
vv.push_back(v);
}
//使用自定义的重载函数比较
sort(vv.begin(),vv.end(),cmp);
for(int i =0; i < vv.size() && i< 5;i++){
cout << vv[i][2] << " " << vv[i][0] <<endl;
}
return 0;
}
算法2
加一个结构体版本的 看起来简单一些
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 310;
struct Score{
int total;
int lan;
int idx;
};
struct Score arr[310];
int n;
//重载比较函数 先比较总成绩 在比较语文成绩 最后比较序号
bool cmp(const struct Score& a,const struct Score& b )
{
if(a.total > b.total) return true;
else if(a.total == b.total && a.lan > b.lan) return true;
else if(a.total == b.total && a.lan == b.lan && a.idx < b.idx) return true;
return false;
}
int main(){
cin >> n;
for(int i = 0; i <n;i++){
int a ,b,c;
cin >> a >>b>>c;
int total = a+b+c;
arr[i].total = total; arr[i].lan = a; arr[i].idx = i+1; //输出序号从1 开始
}
//使用自定义的重载函数比较
sort(arr,arr+n,cmp);
for(int i =0; i < n && i< 5;i++){
cout << arr[i].idx << " " << arr[i].total<<endl;
}
return 0;
}