题解:
- b[i]存a[i]的差分序列,我们要把b[]中除了第一个值以外的其他位的值都通过选择两位一个+1,一个-1变成0。
- 为了使次数减少,我们要把b数组中i>1位的能够两两消除的先消掉,然后剩下的再和1位或者n+1位组合。
- 这样总次数就是min(pos,neg)+|pos-neg|=max(pos,neg),个数就是可以和1位组合的个数,
- 也就是正负消不掉的,需要和1位组合的,这里要知道,最后数组所有值都是b[1],+1是因为要算上原来的a[1].
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MA=1e5+5;
ll a[MA],b[MA];
ll n,pos,neg;
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
b[i]=a[i]-a[i-1];
if(i>1){
if(b[i]>0) pos+=b[i];
else neg+=abs(b[i]);
}
}
printf("%lld\n",max(pos,neg));
printf("%lld\n",abs(pos-neg)+1);
return 0;
}