[HAOI2008] 糖果传递

  • 断环为链后,要求\(\sum_{i=1}^n|s[i]|\)最小。绝对值函数不好处理,考虑它的几何意义,就是数轴上一点到原点的距离。关注变换之后总和为0的性质,利用中位数到各点距离和最小的结论即可解决本题
#include <bits/stdc++.h>
using namespace std;
int a[1000005];
long long s[1000005];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	int m=accumulate(a+1,a+n+1,0ll)/n;
	for(int i=1;i<=n;i++)
	{
		s[i]=s[i-1]+a[i]-m;
	}
	sort(s+1,s+n+1);
	long long ans=0,k=s[(n+1)/2];
	for(int i=1;i<=n;i++)
	{
		ans+=abs(s[i]-k);
	}
	cout<<ans<<endl;
	return 0;
}
posted @ 2025-02-27 15:32  D06  阅读(14)  评论(0)    收藏  举报
//雪花飘落效果