题目背景
语文考试结束了,成绩还是一如既往地有问题。
题目描述
语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行。她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少。你能帮帮她吗?
输入格式
第一行有两个整数 n,p,代表学生数与增加分数的次数。
第二行有 n 个数,a1∼an,代表各个学生的初始成绩。
接下来 p 行,每行有三个数,x,y,z,代表给第 x 个到第 y 个学生每人增加 z 分。
输出格式
输出仅一行,代表更改分数后,全班的最低分。
输入输出样例
输入 #1
3 2 1 1 1 1 2 1 2 3 1
输出 #1
2
说明/提示
对于 40% 的数据,有 n ≤ 10^3。
对于 60% 的数据,有 n ≤ 10^4。
对于 80% 的数据,有 n ≤ 10^5。
对于 100% 的数据,有 n ≤ 5 × 10^6,p ≤ n,学生初始成绩 ≤100,z ≤ 100。
本题思路流程为:
代码实现为:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10000001; // 内存尽可能开的大
int a[N], b[N];
int main(){
int n, p;
cin >> n >> p;
// 利用分差的方法进行处理数据
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = a[i] - a[i - 1];
}
// 使用分差进行给区间增减值
for (int i = 1; i <= p; i++){
int l, r, v;
cin >> l >> r >> v;
b[l] += v;
b[r + 1] -= v;
}
// 查找最小成绩
int res = 100;
for (int i = 1; i <= n; i++){
a[i] = a[i - 1] + b[i];
res = min(res, a[i]);
}
cout << res;
return 0;
}