題目:
語文成績
題目背景
語文考試結束了,成績還是一如既往地有問題。
題目描述
語文老師總是寫錯成績,所以當她修改成績的時候,總是累得不行。她總是要一遍遍地給某些同學增加分數,又要注意最低分是多少。你能幫幫她嗎?
輸入格式
第一行有兩個整數 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;
}