Balancing Bacteria题解

· · 题解

前言:第一眼看到题在一个给定序列上加上一个等差数列就觉的和这题有点类似,但发现首项和公差均为 1 且结束点一定为 n 便发现了有蹊跷。

此题正解应为:二阶差分

观察到

等差数列 1 2 3 4 5
差分一次 1 1 1 1 1
差分两次 1 0 0 0 0

可得结论:在差分两次后的数组的 i 位置上加 1,就等价于在原数组 in 上加上了一个首项为 1 公差为 1 的等差数列。

所以,数组 a 两次差分后所有数的绝对值的和,即为将原数列应加上等差数列的个数。

代码如下

#include <iostream>
#include <cmath>
using namespace std;
long long n,a[200010],s[200010],s2[200010],ans;
//别忘了long long
int main(){
    cin>>n;
    for(int i = 1;i<=n;i++){
        cin>>a[i];
        s[i]=a[i]-a[i-1];
        s2[i]=s[i]-s[i-1];
        ans+=abs(s2[i]);
    }
    cout<<ans;
}