题目链接:https://loj.ac/problem/10010
有 n 个小朋友坐成一圈,每人有
a
i
a_i
ai 颗糖果。每人只能给左右两人传递糖果。每人每次传递一颗糖果的代价为 1 。求使所有人获得均等糖果的最小代价。
分析:
|xn+t1|+|xn+t2|+………+|xn+t(n-1)|+|xn+tn|(tn=0)
因为其中ti均为常数,所以当xn取ti的中位数时该式有最小值。
代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=1e6+10;
LL n,a[N],sum[N];
int main()
{
LL num=0,ave;
scanf("%lld",&n);
for(int i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
num+=a[i];
}
ave=num/n;
for(int i=1; i<=n; i++)
sum[i]=sum[i-1]+(a[i]-ave);
sort(sum+1,sum+1+n);
LL tab=0;
for(int i=1; i<=n; i++)
tab+=abs((-sum[(n+1)>>1])+sum[i]);/*sum[(n+1)>>1]相当于中位数,负的中位数,相当于一个模型,一个点到其余所有点的距离之和的最小值*/
printf("%lld\n",tab);
return 0;
}
追求卓越,成功就会不期而遇。