首页 > 其他分享 >Codeforces Round #802 (Div. 2)C. Helping the Nature(差分)

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

时间:2022-10-25 20:11:25浏览次数:82  
标签:题目 Nature int Codeforces 差分 Helping 数组 操作

题目链接


题目大意:

给你一个有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;
}

标签:题目,Nature,int,Codeforces,差分,Helping,数组,操作
From: https://www.cnblogs.com/empty-y/p/16826124.html

相关文章

  • Codeforces Round #829 (Div. 2) A-E
    比赛链接A题解知识点:枚举。只要一个Q后面有一个A对应即可,从后往前遍历,记录A的数量,遇到Q则数量减一,如果某次Q计数为0则NO。时间复杂度\(O(n)\)空间复杂度\(O(1)\)......
  • Codeforces Round #830 (Div. 2) C1
    C1.Sheikh(Easyversion)显然对于添加一个数进入区间是只增不减的这就提醒了我们此题具有单调性我们最后的答案肯定就是这一整个区间我们考虑怎么找到最小的答案相......
  • Codeforces Round #756 (Div. 3) F
    F.ATMandStudents金典对于一个区间我们不能让他+的过程中出现负数我们ST表处理前缀和区间最小数然后再二分长度暴力枚举左右端点时间复杂度是O(nlogn)哦还要注意的......
  • Educational Codeforces Round 138 (Rated for Div. 2)练习笔记
    \(\text{A.CowardlyRooks}\)有一张\(n\timesn(n\leq8)\)的国际象棋棋盘,上面放了\(m(m\leq8)\)个城堡(能攻击在同一直线的棋子),第\(i\)个城堡位于\((x_i,y_i)\)......
  • Codeforces Round #829-1754A+B与1753A+B+C 题解
    1754A-TechnicalSupport题意给定一个只包含大写字母\(\texttt{Q}\)和\(\texttt{A}\)的字符串,如果字符串里的每一个\(\texttt{Q}\)都能与在其之后的\(\texttt{A......
  • Codeforces 1674 E. Breaking the Wall
    题意给n个数的数列a[n],可以进行任意次操作,每次选取一个位置i,a[i]-=2,a[i-1]-=1,a[i+1]-=1,问最少几次操作可以让任意两个值<=0提示需要进行分类讨论,分成三种情况讨论1.......
  • Codeforces Round #829 (Div. 2)(持续更新)
    Preface难得有下午的CF,而且是连着两场!但是可惜第二场要去做四级模拟打不了了有点可惜(妈的听力错9个属实逆天)这场是手速场,但对于我这种纯老年人来说WA两发加上写的慢还是......
  • 什么是subsignature和return-type-substitutable
    subsignature什么是签名(signature)方法签名组成:方法名+参数列表(参数的类型、个数、顺序)Java语言层面规定的签名是不包含返回值类型的;JVM层面规定的签名是包含返回值类......
  • Codeforces Round #401 (Div. 2) 题解 (待续)
    AShellGame#include<bits/stdc++.h>usingnamespacestd;#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define......
  • Codeforces Round #402 (Div. 1) 题解(待续)
    AStringGame#include<bits/stdc++.h>usingnamespacestd;#define#define#define#define#define#define#define#define#define#define#define#define#define#define#defin......