100.增减序列

原题链接:100. 增减序列


解题思路

求出 a 的差分序列 b,其中 b1 = a1,bi = ai - ai-1(2 <= i <= n)。令 bn+1 = 0。题目对序列 a 的操作,相当于每次可以选出 b1,b2,...,bn+1 中的任意两个数,一个加一,另一个减一。目标是把 b2,b3,...,bn 变为全零。最终得到的数列 a 就是由 n 个 b1 构成的。
从 b1,b2,...,bn+1 中任选两个数的方法可分为四类:

  1. 选 bi 和 bj,其中 2<=i,j<=n。这种操作会改变 b2,b3,...,bn中两个数的值。应该在保证 bi 和 bj 一正一负的前提下,尽量多采用这种操作,更快的接近目标。
  2. 选 b1 和 bj,其中 2<=j<=n.
  3. 选 bi 和 bn+1,其中 2<=i<=n.
  4. 选 b1 和 bn+1,这种情况没意义。

样例代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define N 110000
ll n,m,i,j,p,q,a[N];
int main()
{
    scanf("%lld",&n);
    for (i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    for (i=2;i<=n;i++)
    {
        ll c=a[i]-a[i-1];
        if (c>0)
            p+=c;
        else
            q-=c;
    }
    ll ans1=max(p,q),ans2=abs(p-q)+1;
    cout<<ans1<<endl<<ans2;
    return 0;
}
posted @ 2020-12-20 15:27  hnkjdx_react  阅读(173)  评论(0编辑  收藏  举报