看到这个题我以为只是简单的贪心,但是没法通过局部解解决全局最优解,看到老师讲解才知道另一种思路。
首先
我画了一个草图,Xi表示第i个点向下一个点传送的糖果的数量。然后就可以得到一个等式
由这个等式可以往下推
得到这一步的时候还是有点迷茫,老师说了一个式子
我好像是明白了一点。
最后老师推了一个
在这里我们看到每一个项都与X1有关系,然后求的是每一个x(可为负)的绝对值之和,就转化为一个x1到各个点的最小距离,这个好像就等同于我们之前做的一道题
思路完全一样,最后我们就可以得到相应的代码了
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e6+5;
int m[N],s[N];
int main(void)
{
int n;
long long sum=0;
cin>>n;
for(int i=0;i<n;i++) cin>>m[i],sum+=m[i];
sum/=n;
for(int i=n-1;i>=0;i--)
{
s[i]=m[i]-sum;
s[i]+=s[i+1];
}
sort(s,s+n);
sum=0;
for(int i=0;i<n/2;i++)
sum+=s[n-i]-s[i];
cout<<sum;
}