题意:见训练指南
思路:列方程,化简,点距离和最小。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1e6+50;
int n;
long long a[maxn],c[maxn],sum,m,mid,ans;
int main(){
while(scanf("%d",&n)!=EOF){
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
sum=ans=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum+=a[i];
}
m=sum/n;
sum=0;
for(int i=1;i<n;i++){
sum+=a[i];
c[i]=sum-m*i;
}
sort(c+1,c+n);
if((n-1)%2)///3 0 1 2 3
mid=c[(n>>1)];
else
mid=c[(n>>1)]+c[(n>>1)+1];
for(int i=0;i<n;i++)
ans+=abs(mid-c[i]);
printf("%lld\n",ans);
}
return 0;
}