题目描述 给定一个长度为$n$的数列$a_1, a_2, \dots, a_n$。 每次可以选择一个区间$[l, r]$,使这个区间内的数都加 1 或者都减 1。
请问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。
输入格式

  • 第一行一个正整数$n$。
  • 接下来$n$行,每行一个整数,第$i+1$行的整数表示$a_i$。
    输出格式
  • 第一行输出最少操作次数。
  • 第二行输出最终能得到多少种结果。
    输入输出样例
  • **输入
    4
    1
    1
    2
    2
  • **输出 ```
    1
    2

引言中有介绍如何得到最少的操作次数,对于最终得到的结果数:
我们设正数和为p,负数和为q。
在操作min(p,q)后只剩负数或者正数,这里假设只剩正数。
我们还剩|p-q|次操作次数,在这每次操作中,区间一端必定在正数,另一端我们可以自由选择在哪里,如果在数组首部,我们就改变了最终得到的数组。|p-q|次操作我们可以操作在数组首部的次数有0,1,2……|p-q|。总共有|p-q|+1种情况。

#include<iostream>
#include<vector>

using namespace std;
int main()
{
int n,op,zheng=0,fu=0;
cin>>n;
vector<int>arr(n+2,0);
vector<int>chafen(n+2,0);
for(int i=1;i<=n;i++)
cin>>arr[i];
chafen[1]=arr[1];
for(int i=2;i<=n;i++)
{
chafen[i]=arr[i]-arr[i-1];
if(chafen[i]>=0)
zheng+=chafen[i];
else
fu+=chafen[i];
}
fu=-fu;
op=max(zheng,fu);
cout<<op<<endl<<abs(zheng-fu+1);
}