题目分析
(妹有思路啊)
本题思路的关键是先让序列的的每一项通过加减统一成一个数,再通过加或减变为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