找一点到所有已知点的最小距离,当数为奇数,中间的点,偶数,中间两点均可。
因为到线段两端点的距离和最短的点必然在该线段上;将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;
}