糖果传递 贪心 推公式

有 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);
	}
}
posted @ 2022-11-17 23:03  林动  阅读(18)  评论(0编辑  收藏  举报