P2367 語文成績

樱岛麻衣的鹿發表於2024-04-29

題目:

語文成績

題目背景

語文考試結束了,成績還是一如既往地有問題。

題目描述

語文老師總是寫錯成績,所以當她修改成績的時候,總是累得不行。她總是要一遍遍地給某些同學增加分數,又要注意最低分是多少。你能幫幫她嗎?

輸入格式

第一行有兩個整數 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;
}

相關文章