难点解释:
如果要保证所有的数一样的话,只需要保证差分数列第二个及其之后都是0均可。由于正负数可以相互抵消,所以min(pos,neg)剩余无法抵消的用b1,bn+1抵消均可。
至于有几种方法举例说明:如果最后剩 3 -----> (0,3)(1,2)(,2,1)(,3,0) 这4种方案来选择 b1还是 bn+1
题目来源AcWing:代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+100;
typedef long long ll;
ll a[maxn],b[maxn];
int main()
{
ll n;
cin>>n;
for(int i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
}
// for(int i=2;i<=n;i++)
// {
// a[i]=a[i]-a[i-1];
// }
//这一种方法的错误是它会破坏原来的数值。所以应该采用从后往前的做法。
for(int i=n; i>1; i--)
{
a[i]-=a[i-1];
}
ll pos=0,neg=0;
for(int i=2; i<=n; i++)
{
if(a[i]>0) pos+=a[i];
if(a[i]<0) neg-=a[i];
}
cout<<min(pos,neg)+abs(pos-neg)<<endl;
cout<<abs(pos-neg)+1<<endl;
return 0;
}