天天看點

IncDec Sequence(codevs 2098)

題目描述 Description

  給定一個長度為n的數列{a1,a2...an},每次可以選擇一個區間[l,r],使這個區間内的數都加一或者都減一。

  問至少需要多少次操作才能使數列中的所有數都一樣,并求出在保證最少次數的前提下,最終得到的數列有多少種。

輸入描述  Input Description

  第一行一個正整數n 

  接下來n行,每行一個整數,第i+1行的整數表示ai。

輸出描述  Output Description

  第一行輸出最少操作次數

  第二行輸出最終能得到多少種結果

樣例輸入  Sample Input

4

1

1

2

2

樣例輸出  Sample Output

1

2

資料範圍及提示  Data Size & Hint

  對于100%的資料,n=100000,0<=ai<2147483648。

/*
  典型的差分題目
  先做一個差分序列b,接下來就是怎麼把除了b1之外的所有數都變成0,因為可以進行區間修改,那麼對于序列b來說就是一個數加1的同時一個數減1,或一個數加1,或一個數減1。因為要求步數最少,是以要盡可能把加1用在負數上,把減1用在正數上,剩下的隻有正數或負數時再單獨加1或減1。至于方案數,取決于b1,那麼我們要在不影響步數的情況下修改b1,那麼隻能把單獨加1或減1換成修改b1和原來那個數。 
*/
#include<cstdio>
#include<iostream>
#define M 100010
#define ll long long
using namespace std;
ll a[M],b[M];int n;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        b[i]=a[i]-a[i-1];
    }
    ll tot1=0,tot2=0;
    for(int i=2;i<=n;i++)
      if(b[i]>0)tot1+=b[i];
      else tot2-=b[i];
    cout<<max(tot1,tot2)<<endl<<max(tot1-tot2,tot2-tot1)+1;
    return 0;
}      

View Code

轉載于:https://www.cnblogs.com/harden/p/5924953.html