糖果传递 贪心 推公式
有 n 个小朋友坐成一圈,每人有 a[i] 个糖果。
每人只能给左右两人传递糖果。
每人每次传递一个糖果代价为 1。
求使所有人获得均等糖果的最小代价。
输入格式
第一行输入一个正整数 n,表示小朋友的个数。
接下来 n 行,每行一个整数 a[i],表示第 i 个小朋友初始得到的糖果的颗数。
输出格式
输出一个整数,表示最小代价。
数据范围
1≤n≤1000000,
0≤a[i]≤2×109,
数据保证一定有解。
输入样例:
4
1
2
5
4
输出样例:
4
import java.util.*;
//|x-c1|+|x-c2|+...+|x-cn|=sum
//由抽屉原理,x取ci的中间值时和最小
//C是正数
//avg是平均值
//Cn=avg-an
//Ci=Ci+1 +avg-ai
public class Main
{
static int N=1000005,n,avg;
static int a[]=new int [N],c[]=new int [N];
static long sum,res;
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
for(int i=1;i<=n;++i)
{
a[i]=sc.nextInt();
sum+=a[i];
}
avg=(int)(sum/n);
c[n]=avg-a[n];
for(int i=n-1;i>=1;--i)c[i]=c[i+1]+avg-a[i];
Arrays.sort(c,1,n+1);
int t=(n+1)/2;
for(int i=1;i<=n;++i)
{
res+=Math.abs(c[i]-c[t]);
}
System.out.println(res);
}
}