C++ 编程实现:语文成绩计算 - 轻松解决区间加分问题
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;
}
代码解释
- 头文件包含:使用
#include <iostream>和#include <vector>包含输入输出流和动态数组库。 - 命名空间:使用
using namespace std;简化代码,避免重复写std::。 - 变量声明:使用
int n, m, k;声明学生数、加分次数和小西瓜学号。 - 分数数组:使用
vector<int> scores(n, 0);创建一个大小为n的动态数组scores,用于存储每个学生的成绩,初始值为 $0$。 - 循环遍历:使用
for (int i = 0; i < m; i++) {...}循环遍历 $m$ 次加分操作。 - 输入加分信息:使用
cin >> l >> r >> x;输入每次加分的区间和加分值。 - 区间加分:使用
for (int j = l - 1; j <= r - 1; j++) {...}循环遍历区间内的学生,将他们的分数加上x。 - 输出结果:使用
cout << scores[k - 1] << endl;输出小西瓜的最终分数。
总结
本代码通过使用动态数组存储学生的成绩,并利用循环遍历的方式实现区间加分,最后输出小西瓜的最终成绩。代码简洁易懂,并附有详细解释,适合学习 C++ 语言和算法的初学者。
原文地址: https://www.cveoy.top/t/topic/phOo 著作权归作者所有。请勿转载和采集!