信息学奥赛一本通-编程启蒙(C++版)在线评测系统
3432:【例75.3】 谁拿了最多奖学金
解题思路
本题需要对每个学生的信息进行处理,根据给定的奖学金获取条件计算每个学生能获得的奖学金总额,然后找出获得奖金最多的学生,并统计所有学生获得的奖学金总数。具体步骤如下:
- 读取学生信息:依次读取每个学生的姓名、期末平均成绩、班级评议成绩、是否为学生干部、是否为西部省份学生以及发表的论文数。
- 计算奖学金:根据各项奖学金的获取条件,判断每个学生是否符合条件,若符合则累加相应的奖学金金额。
- 找出最多奖金学生:在计算每个学生的奖学金总额时,记录获得奖金最多的学生的姓名和奖金总额。若有多个学生奖金相同,选择输入文件中出现最早的学生。
- 统计奖学金总数:累加所有学生获得的奖学金金额。
C++ 代码实现
#include <iostream>
#include <string>
using namespace std;
int main() {
int N;
cin >> N;
string maxName;
int maxBonus = 0;
int totalBonus = 0;
for (int i = 0; i < N; ++i) {
string name;
int finalScore, classScore, papers;
char isCadre, isWestern;
cin >> name >> finalScore >> classScore >> isCadre >> isWestern >> papers;
int bonus = 0;
// 院士奖学金
if (finalScore > 80 && papers >= 1) {
bonus += 8000;
}
// 五四奖学金
if (finalScore > 85 && classScore > 80) {
bonus += 4000;
}
// 成绩优秀奖
if (finalScore > 90) {
bonus += 2000;
}
// 西部奖学金
if (finalScore > 85 && isWestern == 'Y') {
bonus += 1000;
}
// 班级贡献奖
if (classScore > 80 && isCadre == 'Y') {
bonus += 850;
}
totalBonus += bonus;
if (bonus > maxBonus) {
maxBonus = bonus;
maxName = name;
}
}
cout << maxName << endl;
cout << maxBonus << endl;
cout << totalBonus << endl;
return 0;
}
代码解释
-
变量定义:
N
:表示学生的总数。maxName
:记录获得最多奖金的学生的姓名。maxBonus
:记录获得最多奖金的学生的奖金总额。totalBonus
:记录所有学生获得的奖学金总数。
-
循环处理每个学生的信息:
- 读取每个学生的姓名、期末平均成绩、班级评议成绩、是否为学生干部、是否为西部省份学生以及发表的论文数。
- 初始化该学生的奖学金总额
bonus
为 0。 - 根据各项奖学金的获取条件,判断该学生是否符合条件,若符合则累加相应的奖学金金额。
- 将该学生的奖学金总额累加到
totalBonus
中。 - 如果该学生的奖学金总额大于
maxBonus
,则更新maxBonus
和maxName
。
-
输出结果:
- 输出获得最多奖金的学生的姓名。
- 输出该学生获得的奖金总额。
- 输出所有学生获得的奖学金总数。