C++信息学奥赛1839:【05NOIP提高组】谁拿了最多奖学金

在这里插入图片描述
这段代码是一个奖学金评选程序,根据学生的各项指标计算出最高奖学金金额和获得该奖学金的学生姓名。

具体解析如下:

#include <iostream>
#include <string>
using namespace std;

int main() {
    int n; // 定义整数变量n,用于存储学生人数
    cin >> n; // 输入学生人数并存储到n中

    int term; // 定义整数变量term,用于存储学期成绩
    int review; // 定义整数变量review,用于存储论文成绩
    char Student; // 定义字符变量Student,用于存储是否有困难家庭情况
    char Western; // 定义字符变量Western,用于存储是否参加过西部计划
    int Thesis; // 定义整数变量Thesis,用于存储论文是否被发表
    long Bonu = 0; // 定义长整数变量Bonu,用于存储奖学金金额
    long Bonus = 0; // 定义长整数变量Bonus,用于累加所有学生的奖学金金额

    int item; // 定义整数变量item,用于记录获得最高奖学金的学生的序号
    string name; // 定义字符串变量name,用于存储学生姓名
    string maxname; // 定义字符串变量maxname,用于存储获得最高奖学金的学生姓名
    int max = 0; // 定义整数变量max,用于存储最高奖学金金额,初始值为0

    for (int i = 0; i < n; i++) { // 循环输入每个学生的信息
        cin >> name >> term >> review >> Student >> Western >> Thesis;

        // 根据各项条件依次计算奖学金金额并累加到Bonu和Bonus中
        if (term > 80 && Thesis > 0) {
            Bonu += 8000;
            Bonus += 8000;
        }
        if (term > 85 && review > 80) {
            Bonu += 4000;
            Bonus += 4000;
        }
        if (term > 90) {
            Bonu += 2000;
            Bonus += 2000;
        }
        if (term > 85 && Western == 'Y') {
            Bonu += 1000;
            Bonus += 1000;
        }
        if (review > 80 && Student == 'Y') {
            Bonu += 850;
            Bonus += 850;
        }

        // 判断当前学生的奖学金金额是否大于当前最大值max,若是,则更新max、item和maxname
        if (Bonu > max) {
            max = Bonu;
            item = i;
            maxname = name;
        }
        
        Bonu = 0; // 将Bonu重置为0,准备计算下一个学生的奖学金金额
    }

    // 输出最高奖学金的学生姓名、最高奖学金金额以及所有学生的奖学金总额
    cout << maxname << endl;
    cout << max << endl;
    cout << Bonus;

    return 0;
}

代码首先定义了各种变量,包括整数变量用于存储成绩和数量信息,字符变量用于存储特殊情况的标志,以及字符串变量用于存储学生姓名。然后通过 cin 输入学生人数。

接下来,通过一个 for 循环,按顺序输入每个学生的姓名和各项指标的值。

在循环中,根据规定的条件判断学生是否满足获得奖学金的条件,并根据不同条件累加对应的奖金到 BonuBonus 变量中。

在每次循环结束后,通过比较 Bonu 和当前最大奖学金金额 max 的大小,更新最大奖学金金额 max,记录获得该奖学金的学生的序号 item 和姓名 maxname

循环结束后,输出最高奖学金的学生姓名 maxname、最高奖学金金额 max 和所有学生的奖学金总额 Bonus

该代码的目的是根据学生的各项指标计算奖学金金额,并输出获得最高奖学金的学生姓名和金额,以及所有学生的奖学金总额。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目描述: 给定两支队伍的比分,已知每一局比的胜负,求哪支队伍可能获得这场比的胜利。 规则如下: - 比共进行 $n$ 局,每局比要么由一支队伍获胜,要么由另一支队伍获胜,不可能出现平局。 - 获得比胜利的队伍必须在 $n$ 局比中获胜至少 $\left\lceil\frac{n}{2}\right\rceil$ 局。 输入格式: - 第一行一个整数 $n$,表示比总共进行了 $n$ 局 $(1≤n≤100)$。 - 第二行一个整数 $a$,表示第一支队伍得分 $(0≤a≤n)$。 - 第三行一个整数 $b$,表示第二支队伍得分 $(0≤b≤n)$。 - 接下来 $n$ 行,每行给出一局比的结果,用 0 表示第一支队伍获胜,用 1 表示第二支队伍获胜。 输出格式: - 如果第一支队伍可能获得比胜利,则输出 0。 - 如果第二支队伍可能获得比胜利,则输出 1。 - 如果两支队伍都有可能获得比胜利,则输出 -1。 思路分析: 根据题目描述,我们可以得知,获得比胜利的队伍必须获胜至少 $\left\lceil\frac{n}{2}\right\rceil$ 局,因此,我们需要统计两支队伍分别获胜的局数。 对于一局比,如果第一支队伍获胜,则将第一支队伍的胜利局数加一,如果第二支队伍获胜,则将第二支队伍的胜利局数加一。 统计完两支队伍分别获胜的局数后,判断哪支队伍可能获得比胜利即可。 代码实现: 时间复杂度:$O(n)$ 空间复杂度:$O(1)$ ```c #include <stdio.h> int main() { int n, a, b; scanf("%d%d%d", &n, &a, &b); int cnta = 0, cntb = 0; for (int i = 1; i <= n; i ++ ) { int x; scanf("%d", &x); if (x == 0) cnta ++ ; else cntb ++ ; } int m = (n + 1) / 2; if (a + cnta >= m && b + cntb < m) printf("0\n"); else if (b + cntb >= m && a + cnta < m) printf("1\n"); else printf("-1\n"); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值