糖果传递 数学题

糖果传递 数学题

题解

找一点到所有已知点的最小距离,当数为奇数,中间的点,偶数,中间两点均可。
因为到线段两端点的距离和最短的点必然在该线段上;将n个点按从小到大排序,则未被选中的点必须均匀分布在被选中的点的两侧,才能保证被选中的点能够在每一对点(两点分别在该点左侧和右侧)组成的线段上;

#include<iostream>
#include<algorithm> 
using namespace std;

#define  ll  long long

int n;

ll sum;
ll mid;
ll ave;
ll ans;
int a[1000005];
int c[1000005];


int main()
{
    
    
	cin>>n;
	for(int i=1;i<=n;i++)
	{
    
    
		cin>>a[i];
		sum+=a[i];		
	}
	
	ave=sum/n;
	c[0]=0;
	
	for(int i=1;i<n;i++)
	{
    
    
		c[i]=c[i-1]+a[i]-ave;
	}
	
	sort(c,c+n);
	mid=c[n/2];
	
	for(int i=0;i<n;i++)
	{
    
    
		ans+=abs(c[i]-mid);
	}
	
	printf("%lld",ans);
	
	
	return 0;
}
 

猜你喜欢

转载自blog.csdn.net/weixin_45448563/article/details/113622820