奖学金
题目描述
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:
7 279
5 279
这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之和) ,但学号为 7 的学生语文成绩更高一些。如果你的前两名的输出数据是:
5 279
7 279
则按输出错误处理,不能得分。
输入格式
第1为一个正整数n,表示该校参加评选的学生人数。
第2到n+1行,每行有3个用空格隔开的数字,每个数字都在0到100之间 z 第1行的2个数字依次表示学号为j-1的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为1∼n(恰好是输入数据的行号减1)。
所给的数据都是正确的,不必检验。
输出格式
共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。
样例输入一
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
样例输入二
8 80 89 89 88 98 78 90 67 80 87 66 91 78 89 91 88 99 77 67 89 64 78 89 98
样例输出二
8 265 2 264 6 264 1 258 5 258
说明/提示
50%的数据满足:各学生的总成绩各不相同。
100%的数据满足:6≤n≤300。
解法一
语数英?总分?学号?明显结构体哇!
排序?按总分?按语文成绩?按学号?结构体排序!
一道结构体排序的微进阶题,排序的逻辑稍稍复杂了一点。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 struct Stu 5 { 6 int yu,shu,ying; 7 int id; 8 int sum; 9 }s[305]; 10 11 bool cmp (Stu a,Stu b) 12 { 13 if(a.sum != b.sum) 14 { 15 return a.sum > b.sum; 16 } 17 else if(a.yu != b.yu) 18 { 19 return a.yu > b.yu; 20 } 21 else 22 { 23 return a.id < b.id; 24 } 25 } 26 27 int main () 28 { 29 int n; 30 cin>>n; 31 32 for(int i=0;i<n;i++) 33 { 34 cin>>s[i].yu>>s[i].shu>>s[i].ying; 35 s[i].sum=s[i].yu+s[i].shu+s[i].ying; 36 s[i].id=i+1; 37 } 38 sort(s,s+n,cmp); 39 for(int i=0;i<5;i++) 40 { 41 cout<<s[i].id<<" "<<s[i].sum<<endl; 42 } 43 return 0; 44 }
代码挺易读的哈,就不在详细阐述惹。对了!结构体后面切记加分号!
干货
上述代码有个偷懒小技巧