C++ 编程实现:语文成绩计算 - 轻松解决区间加分问题

题目背景

语文老师要给大家报成绩了。但是他很喜欢卖关子。

题目描述

班级里有学号为 $1 \sim n$ 的 $n$ 名同学。

语文老师的公布成绩方法是这样的:

  • 一开始所有同学的分数都是 $0$ 分。
  • 他会增加 $m$ 次分数。每一次,他会说出三个数字 $l,r,x$,表示学号从 $l$ 到 $r$ 的同学分数增加了 $x$。

小西瓜的学号是 $k$,但是他每次都算不清自己的成绩到底是多少,小西瓜向你求助,希望你能帮他算出他的语文成绩。

输入格式

第一行有两个整数 $n$,$m$,$k$,分别代表学生数、增加分数的次数和小西瓜的学号。

接下来 $m$ 行,每行有三个数,$l$,$r$,$x$,代表给第 $l$ 个到第 $r$ 个学生每人增加 $x$ 分。

输出格式

输出仅一行,代表小西瓜的语文成绩。

样例 #1

样例输入 #1

3 3 2
1 1 1
1 2 2
2 3 3

样例输出 #1

5

提示

第一次给 $1$ 号加了 $1$ 分,成绩分别是 $1$ $0$ $0$.

第二次给 $1 \sim 2$ 号加了 $2$ 分,成绩分别是 $3$ $2$ $0$.

第三次给 $2 \sim 3$ 号加了 $3$ 分,成绩分别是 $3$ $5$ $3$.

小西瓜学号为 $2$,他的分数就是 $5$.

数据范围

对于 $60%$ 的数据,有 $n \le 10^3$。

对于 $100%$ 的数据,有 $m\le n \le 10^5$,$x \le 100$。

C++ 代码实现

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n, m, k;
    cin >> n >> m >> k;

    vector<int> scores(n, 0);

    for (int i = 0; i < m; i++) {
        int l, r, x;
        cin >> l >> r >> x;

        for (int j = l - 1; j <= r - 1; j++) {
            scores[j] += x;
        }
    }

    cout << scores[k - 1] << endl;

    return 0;
}

代码解释

  1. 头文件包含:使用 #include <iostream>#include <vector> 包含输入输出流和动态数组库。
  2. 命名空间:使用 using namespace std; 简化代码,避免重复写 std::
  3. 变量声明:使用 int n, m, k; 声明学生数、加分次数和小西瓜学号。
  4. 分数数组:使用 vector<int> scores(n, 0); 创建一个大小为 n 的动态数组 scores,用于存储每个学生的成绩,初始值为 $0$。
  5. 循环遍历:使用 for (int i = 0; i < m; i++) {...} 循环遍历 $m$ 次加分操作。
  6. 输入加分信息:使用 cin >> l >> r >> x; 输入每次加分的区间和加分值。
  7. 区间加分:使用 for (int j = l - 1; j <= r - 1; j++) {...} 循环遍历区间内的学生,将他们的分数加上 x
  8. 输出结果:使用 cout << scores[k - 1] << endl; 输出小西瓜的最终分数。

总结

本代码通过使用动态数组存储学生的成绩,并利用循环遍历的方式实现区间加分,最后输出小西瓜的最终成绩。代码简洁易懂,并附有详细解释,适合学习 C++ 语言和算法的初学者。

C++ 编程实现:语文成绩计算 - 轻松解决区间加分问题

原文地址: https://www.cveoy.top/t/topic/phOo 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录