1 条题解

  • 0
    @ 2026-10-18 21:32:35

    [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';
    }
    
    • 1

    信息

    ID
    487
    时间
    1000ms
    内存
    256MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者