【题目链接】
ybt 1839:【05NOIP提高组】谁拿了最多奖学金
OpenJudge NOI 1.9 04:谁拿了最多奖学金
洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金
【题目考点】
1. 模拟
2. 求和
3. 求最值
【解题思路】
本题考查对稍微复杂的业务逻辑的模拟,需要答题者有良好的代码组织能力,即每个变量的意义要明确,组织要清晰,添加合理的注释,力求使自己写的代码自己要能看懂(不要觉得这是很容易的事情)。
本题可以用多个数组完成,也可以用结构体数组完成。
(推荐使用结构体。使用结构体的目的就是使代码语意更明确。这一点十分重要,可以帮助你少出bug,或出bug后容易查bug,能帮你节省大量时间)
【题解代码】
解法1:使用多个数组
#include<bits/stdc++.h>
using namespace std;
#define N 105
string name[N];//name[i]:第i人的姓名
int money[N];//money[i]:第i人获得的奖学金 初值为0
int main()
{
int n, gStudy, gClass, paperNum, sum = 0, mxi = 1;//gStudy:学习成绩 gClass:班级成绩 paperNum:论文数量
char isLeader, isWest;//isLeader:是否是干部 isWest:是否来自西部
cin >> n;
for(int i = 1; i <= n; ++i)
{
cin >> name[i] >> gStudy >> gClass >> isLeader >> isWest >> paperNum;
if(gStudy > 80 && paperNum >= 1)
money[i] += 8000;
if(gStudy > 85 && gClass > 80)
money[i] += 4000;
if(gStudy > 90)
money[i] += 2000;
if(gStudy > 85 && isWest == 'Y')
money[i] += 1000;
if(gClass > 80 && isLeader == 'Y')
money[i] += 850;
if(money[i] > money[mxi])//求最大值下标 mxi:获得最多奖学金的人的编号。如有相同最大值,只会取先出现的最大值的下标
mxi = i;
sum += money[i];//sum:所有人奖学金总和
}
cout << name[mxi] << endl << money[mxi] << endl << sum;
return 0;
}
解法2:使用结构体
#include<bits/stdc++.h>
using namespace std;
#define N 105
struct Student
{
string name;
int money;
Student(){}//空构造函数,如果没有空构造函数,就无法声明Student对象数组
Student(string _name, int gStudy, int gClass, char isLeader, char isWest, int paperNum)
{//通过各种指标构造Student对象
name = _name;
money = 0;
if(gStudy > 80 && paperNum >= 1)
money += 8000;
if(gStudy > 85 && gClass > 80)
money += 4000;
if(gStudy > 90)
money += 2000;
if(gStudy > 85 && isWest == 'Y')
money += 1000;
if(gClass > 80 && isLeader == 'Y')
money += 850;
}
};
Student stu[N];//stu[i]:学生i
int main()
{
string name;
int n, gStudy, gClass, paperNum, sum = 0, mxi = 1;//gStudy:学习成绩 gClass:班级成绩 paperNum:论文数量
char isLeader, isWest;//isLeader:是否是干部 isWest:是否来自西部
cin >> n;
for(int i = 1; i <= n; ++i)
{
cin >> name >> gStudy >> gClass >> isLeader >> isWest >> paperNum;
stu[i] = Student(name, gStudy, gClass, isLeader, isWest, paperNum);//生成对象赋值给stu[i]
if(stu[i].money > stu[mxi].money)//求最大值下标 mxi:获得最多奖学金的人的编号。如有相同最大值,只会取先出现的最大值的下标
mxi = i;
sum += stu[i].money;//sum:所有人奖学金总和
}
cout << stu[mxi].name << endl << stu[mxi].money << endl << sum;
return 0;
}