[NOIP 2007 普及组] 奖学金 · 教师题解
[NOIP 2007 普及组] 奖学金
知识点
排序、结构体、自定义比较
解题思路
保存每人的学号、语文成绩、总分。按照总分降序、语文降序、学号升序排序,输出前五人的学号与总分。
正确性说明
比较规则逐级处理题目规定的所有并列情况,排序后的先后关系正是奖学金优先级,因此前五名即所求。
易错点
学号是输入次序从1开始;并列时比较语文而不是数学或英语;最后学号小者优先。
复杂度
时间O(n log n),空间O(n)。
参考代码(GNU C++17)
#include<bits/stdc++.h>
using namespace std;
struct Student{int id,ch,total;};
int main(){
int n;cin>>n;vector<Student>a(n);
for(int i=0;i<n;++i){int c,m,e;cin>>c>>m>>e;a[i]={i+1,c,c+m+e};}
sort(a.begin(),a.end(),[](const Student &x,const Student &y){
if(x.total!=y.total)return x.total>y.total;
if(x.ch!=y.ch)return x.ch>y.ch;return x.id<y.id;
});
for(int i=0;i<5;++i)cout<<a[i].id<<' '<<a[i].total<<'\n';
}