Balancing Bacteria题解
前言:第一眼看到题在一个给定序列上加上一个等差数列就觉的和这题有点类似,但发现首项和公差均为
- 题意:给定数组
a ,可以在任意位置i 加上(或减去)一个首项为1 ,公差为1 ,长度为n-i+1 (即结束点为n )的等差数列。问需要加(或减)几个等差数列可使a 中的值全为0 。
此题正解应为:二阶差分。
观察到
| 等差数列 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 差分一次 | 1 | 1 | 1 | 1 | 1 |
| 差分两次 | 1 | 0 | 0 | 0 | 0 |
可得结论:在差分两次后的数组的
所以,数组
代码如下
#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;
}