题目
给定一个长度为 n的数列 a1,a2,…,an,每次可以选择一个区间[l,r],使下标在这个区间内的数都加一或者都减一。求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种。
题解
代码
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
int n;
int main()
{
scanf("%d",&n);
long long posum=0,negsum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i]-a[i-1];
}
for(int i=2;i<=n;i++)
{
if(b[i]>0) posum+=b[i];
if(b[i]<0) negsum+=abs(b[i]);
}
cout<<min(posum,negsum)+abs(posum-negsum)<<endl;
cout<<abs(posum-negsum)+1<<endl;
return 0;
}