中点到所有点的距离加和最小-----------------------这个是个很重要的结论,前边推理的公式大概就是----如何想到使用这种方法呢?就是降维从N到1,
其实如果现场发挥做这个题的话,往这个方向想确实有点难,多做就好了
代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 1000000+10;
long long s[maxn],c[maxn],sum,M;
int n;
int main()
{
while(scanf("%d",&n)!=EOF)
{
sum = 0;
for(int i = 1; i <=n ; i++)
{
scanf("%lld",&s[i]);
sum += s[i];
}
M = sum/n;
c[0] = 0;
for(int i =1 ; i < n ; i++)
{
c[i] = c[i-1] + s[i] - M;//递推C数组
}
sort(c,c+n);
long long x1 = c[n/2],ans = 0;
for(int i =0 ; i <n ; i++)
{
ans += abs(x1-c[i]);
}
printf("%lld\n",ans);
}
return 0;
}