Codeforces Round #802 (Div. 2)C. Helping the Nature(差分)

题目链接


题目大意:

给你一个有n个元素的数组a,你可以通过一下三种操作使数组的每一个值都为0:

  1. 选择一个下标i,然后让a[1],a[2]....a[ i ] 都减一;
  2. 选择一个下标i,然后让a[i],a[i+1]....a[n] 都减一;
  3. 让每一个值都加一
    问让整个数组的值都为0的最小操作数。

题目思路:

我们观察所有操作,发现其都是让一个连续区间都减去一个相同的数,或者加上一个相同的数,这与差分十分相似,所以我们将其转化为差分操作:
1.a[1]-1,a[i+1]+1
2.a[i]-1
3.a[1]+1
因为操作1每次都会改变两个元素的值,所以根据贪心的思想我们要尽量多的使用操作1

所以我们将原数组转化为差分数组,应用操作即可


代码实现:

# include<iostream>
# include<bits/stdc++.h>
using namespace std;
# define int long long
# define endl "\n"
const int N = 2e5 + 10;
int a[N];
int b[N];
void solve() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> a[i];
	for (int i = 1; i <= n; ++i) b[i] = a[i] - a[i - 1];
	int ans = 0;
	for (int i = 2; i <= n; ++i) {
		if (b[i] < 0) {//小于0使用操作1
			b[1] += b[i];
			ans += abs(b[i]);
		} else ans += b[i];//大于0使用操作2
	}
	ans += abs(b[1]);//最后对a[1]看需要使用操作2还是操作3
	cout << ans << endl;
}
int tt;
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	tt = 1;


	cin >> tt;
	while (tt--)solve();


	return 0;
}
posted @ 2022-10-25 20:07  empty_y  阅读(38)  评论(0)    收藏  举报