1 条题解
-
0
[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