P2367 语文成绩

题目:

语文成绩

题目背景

语文考试结束了,成绩还是一如既往地有问题。

题目描述

语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行。她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少。你能帮帮她吗?

输入格式

第一行有两个整数 n,p,代表学生数与增加分数的次数。

第二行有 n 个数,a_1 \sim a_n,代表各个学生的初始成绩。

接下来 p 行,每行有三个数,x,y,z,代表给第 x个到第 y 个学生每人增加 z 分。

输出格式

输出仅一行,代表更改分数后,全班的最低分。

样例 #1

样例输入 #1

3 2
1 1 1
1 2 1
2 3 1

样例输出 #1

2

原题链接

思路:
差分题
差分公式有:arr[i] - arr[i-1] = drr[i]
首先一个差分数组 drr 保存2个数之间的差,
然后根据给定的范围a,b,c, 更改drr数组的值:
左端点是加上c,便可求出区间内的其他数 drr[a] += c
右端点后一个数减去c,可得到右端点的新值,也代表这个区间结束 drr[b+1] -= c;

方法一:

点击查看代码
#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define rep(i,a,b) for(int i = (a); i <= (b); i++)
#define lop(i,a,b) for(int i = (a); i < (b); i++)
#define dwn(i,a,b) for(int i = (a); i >= (b); i--)
#define mset(t,x) memset(t,x,sizeof(t));
#define ll long long
#define el '\n'

using namespace std;
const int N = 5E6 + 5;
int n, m;
int arr[N], drr[N];
void solve()
{
	cin >> n >> m;
	rep(i, 1, n) {//读入数据
		cin >> arr[i];
		drr[i] = arr[i] - arr[i - 1];//差分数组
	}
	rep(i, 1, m) {
		int a, b, c;
		cin >> a >> b >> c;
		drr[a] += c;//更改差分数组的值来更改区间的值
		drr[b + 1] -= c;
	}
	int minn = 100;
	rep(i, 1, n) {
		arr[i] = arr[i - 1] + drr[i];//利用差分公式求新的值
		minn = min(arr[i], minn);
	}
	cout << minn;
}

int main()
{
	ios;
	solve();
	return 0;
}
posted @ 2024-04-29 11:34  樱岛麻衣的鹿  阅读(21)  评论(0编辑  收藏  举报