[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';
}
返回题目