1 条题解

  • 0
    @ 2026-10-18 23:28:32

    [NOIP 2005 提高组] 谁拿了最多奖学金

    知识点

    条件判断、累加、最大值维护

    解题思路

    逐名学生独立判断五个获奖条件,满足哪个就把对应金额相加。累加全体学生总额,同时仅在当前个人金额严格大于已知最大值时更新姓名和最大金额,从而保留最早出现的并列者。

    正确性说明

    各奖项互不排斥,五次独立判断精确求出该生的全部奖金。总额逐人相加正确;最大值更新只在严格改进时发生,所以任何时刻都保存已处理学生中最高金额及最早获奖者。

    易错点

    条件都是“高于”,不是大于等于;不能使用else if导致只能获一项奖;总奖金额与个人最大金额分开维护;并列时保留最早输入者。

    复杂度

    时间O(N),额外空间O(1),不计姓名字符串。

    参考代码(GNU C++17)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){int n;cin>>n;string best;int mx=-1,total=0;while(n--){string name;int a,b,p;char leader,west;cin>>name>>a>>b>>leader>>west>>p;int v=0;if(a>80&&p>=1)v+=8000;if(a>85&&b>80)v+=4000;if(a>90)v+=2000;if(a>85&&west=='Y')v+=1000;if(b>80&&leader=='Y')v+=850;total+=v;if(v>mx){mx=v;best=name;}}cout<<best<<'\n'<<mx<<'\n'<<total<<'\n';}
    
    • 1

    [NOIP 2005 提高组] 谁拿了最多奖学金

    信息

    ID
    486
    时间
    1000ms
    内存
    125MiB
    难度
    进阶
    标签
    递交数
    0
    已通过
    0
    上传者