Acwing 122.糖果传递(思路题)

在这里插入图片描述
看到这个题我以为只是简单的贪心,但是没法通过局部解解决全局最优解,看到老师讲解才知道另一种思路。
在这里插入图片描述
首先
在这里插入图片描述
我画了一个草图,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;
}

猜你喜欢

转载自blog.csdn.net/qq_52358098/article/details/113579183