信息学奥赛一本通 1839:【05NOIP提高组】谁拿了最多奖学金 | OpenJudge NOI 1.9 04:谁拿了最多奖学金 | 洛谷 P1051 [NOIP2005 提高组] 谁拿了最多奖学金

【题目链接】

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; 
}
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值