AcWing 100. 增减序列
原题链接
中等
作者:
Aleia
,
2024-10-08 19:11:57
,
所有人可见
,
阅读 2
#include <iostream>
using namespace std;
const int N = 101000;
int a[N];
typedef long long LL;
int main()
{
//目标是把b[2]到b[n]都变为0
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=n;i>1;i--) a[i] -= a[i-1];//求差分数组(逆序)
LL pos = 0, neg = 0;
//求出正数的和,与负数的绝对值的和
//操作差分数组b[2]到b[n],共min(pos,neg)次
for(int i=2;i<=n;i++)
{
if(a[i]>0) pos+=a[i];
else neg -=a[i];
}
//剩下的pos或者neg 与 b[1]或者b[n+1]操作,共需|pos-neg|次
cout<<min(pos,neg) + abs(pos-neg)<<endl;
//a[k] = b[1]+....+b[k]
//而b[1]到b[k]都为0
//所以a[k] = b[1] k属于1到n,共|pos-neg|+1种结果
//例如最后的pos = 3
//则可以为(0,3) (1,2) (2,1) (3,0)
cout<<abs(pos-neg) + 1 <<endl;
return 0;
}