首页 > 其他分享 >CF 1700C Helping the Nature(差分)

CF 1700C Helping the Nature(差分)

时间:2022-11-30 14:13:11浏览次数:46  
标签:变为 int 1700C CF 差分 Helping 数组 序列 每一项

题目分析

(妹有思路啊)

本题思路的关键是先让序列的的每一项通过加减统一成一个数,再通过加或减变为0

进一步我们可以想到构造一个差分数组,从第二项开始通过加减使差分数组每一项都变为0,每加或减一都要记一次操作,一直操作到最后,此时我们得到了将序列每一项统一成同一数所需的步骤数

那么接着如何让原序列的每一项都变为0?假如我们之前将原序列每一项都统一变为了x,此时只需要对所有数同加或同减|x|次一,两次的步骤数加起来,我们就得到了总的步骤数

参考代码

(思路理解了后就会发现其实不用专门构造一个差分数组)

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N], s[N];
int main()
{
	int t;
	cin >> t;
	while (t -- )
	{
		memset(s, 0, sizeof s);	// 初始化差分数组
		int n;
		cin >> n;
		for (int i = 1; i <= n; i ++ )
		{
			cin >> a[i];
			// 构造差分数组
			// 其实如果这一步通过s[i] = a[i] - a[i -1]的话
			// 前面就不用memset()了
			s[i] += a[i];
			s[i + 1] -= a[i];
		}
		// i项之前每一项都为prev
		long long prev = a[1], ans = 0;
		for (int i = 2; i <= n; i ++ )
		{
			ans += abs(s[i]);	// abs(s[i])为将差分变为0的步骤数
			if (s[i] < 0) prev += s[i];	// 如果s[i] < 0,就要操作i项之前的所有数
		}
		ans += abs(prev);	// abs(prev)为将每一项变为0所需步骤数
		cout << ans << endl;
	}
	return 0;
}

标签:变为,int,1700C,CF,差分,Helping,数组,序列,每一项
From: https://www.cnblogs.com/Panmaru/p/16938155.html

相关文章

  • 浪潮存储:拥抱云原生,进入CNCF云原生存储全景图
    近日,浪潮存储正式加入云原生计算基金会(CloudNativeComputingFoundation,以下简称CNCF)的云原生存储(CloudNativeStorage)全景图。这意味着,浪潮存储被国际权威机构认可,成为......
  • 题解 CF546C
    题解CF546Ccodeforces网址这个题看起来很难,其实是一个模拟题大体思路就是模拟每个人拿出手牌,并且比较,然后放入相应的人的手牌中的过程然后让我们想一下,如何才能便捷的......
  • 题解 CF1676G
    这个题标签里有树形dp,但是其实用dfs已经足以解决这道题。看这道题就可以发现这两道题其实是差不多的。首先需要给两个节点之间建边,我们需要从2到n循环输入。因为......
  • 题解 CF1743B
    这个题是个简单的构造题因为不能有连续的“排列”,而排列序列都是必须是以\(1\)开头所以我们只要让\(2\)和\(1\)不相邻就能保证一个序列里只有它本身和\(1\)这两......
  • 题解 CF1370B
    题解CF1370B这个题跟脑筋急转弯一样诶\(gcd\)这个东西他有很多种可能性,但是如果我们考虑最简单的数字性质奇偶,就会发现,其实所有偶数的\(gcd\)都是\(2\)对吧所以,我......
  • 题解 CF471A
    题解CF471A这个题看题解都写得非常的冗余,不简洁,这里提供一种特别神奇的做法首先他需要我们判断这里是否有相同的数字,并且还要通过这个相同的个数来进行判断所以,我们可......
  • 题解 CF1719B
    题解CF1719B这个题观察样例,可以发现,被选中的两个数,一定是相邻的两个数。所以,我们只需要先循环一遍,看看有多少数满足,然后判断是否等于n。如果等于说明可以,先输出YES......
  • 题解 CF518B
    题解CF518B这个题最暴力的做法就是对于每个\(s_i\)都在b字符串里扫一遍但是\(s.len\leq2\times10^5\)所以肯定过不了但是我们思考一下,这里的字母对应其实可以......
  • 题解 CF1719A
    题解CF1719A这个题判断\(n+m\)的奇偶性就可以了。奇数输出Burenka,偶数输出Tonya。#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>......
  • 题解 CF1716B
    题解CF1716B这是一个纯纯的构造题我们要构造n个序列,每个序列他的元素\(a_i\)在第i个位置上的数量都应该比上一个序列的数量并且这种序列只能通过交换两个数字来......