#0x03 IncDec序列 (差分思想)

题解:

  • 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;
}
posted @ 2020-02-02 22:19  A_sc  阅读(131)  评论(0)    收藏  举报