糖果传递

简介: 1045: [HAOI2008] 糖果传递http://www.lydsy.com/JudgeOnline/problem.php?id=1045 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1416  Solved: 658 [Submit][Status] Description 有n个小朋友坐成一圈,每人有ai个糖果

1045: [HAOI2008] 糖果传递
http://www.lydsy.com/JudgeOnline/problem.php?id=1045
Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1416  Solved: 658
[Submit][Status]
Description
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。

Input
小朋友个数n 下面n行 ai

Output
求使所有人获得均等糖果的最小代价。

Sample Input
4
1
2
5
4


Sample Output
4

数据规模
30% n<=1000
100% n<=1000000

 

微笑交换糖果的方式为:(人给人)1n21,32...nn-1.

ave为最终期望每人拥有的糖果数.

a[i]为第i个人拥有的糖果数,下标从1开始。

b[i]表示第i个人需要给第i-1个人的糖果数,允许为负。

假设第一个小朋友给第n个小朋友k个糖果,则

b[1]=k

a[1]-b[1]+b[2]=ave(原来的-送出的+新得到的=最终期望)得:

b[2]=b[1]-a[1]+ave;一般表达式为b[i]=b[i-1]-a[i-1]+ave;通项公式为:

b[i]=k- (求和(下标:1)(上标i-1(表达式:a[i]))+(i-1)*ave;

c[i]=(求和(下标:1)(上标i(表达式:a[i]))-i*ave;

b[i]=k-c[i-1];

显然有c[n]=0;b[1]=k=k+c[n];

总的代价为:求和(下标:1)(上标n(表达式:|b[i]| )

等于:求和(下标:1)(上标n(表达式:|k-c[i]| );

可转化为数轴上有n个点,求某点到其他所有点线段和的最小值。

故对c[]数组排序,找出中位数即可;若有偶数个,取中间两个任意一个都可以。

 

目录
相关文章
|
7月前
【Leetcode -455.分发饼干 -459.重复的字符串】
【Leetcode -455.分发饼干 -459.重复的字符串】
38 0
|
7月前
数列中,第一项为3,后一项都比前一项的值增5。下列给定程序中,函数fun的功 能是:计算前n(4≤n≤50)项的累计和。在累加过程中把那些被4除后余2的当前累 加值放入数组中
数列中,第一项为3,后一项都比前一项的值增5。下列给定程序中,函数fun的功 能是:计算前n(4≤n≤50)项的累计和。在累加过程中把那些被4除后余2的当前累 加值放入数组中
|
9月前
wustojc2013分糖果
wustojc2013分糖果
27 0
wustojc2013分糖果
|
11月前
|
算法 Python
定义一个函数,接收三个参数返回一元二次方程
定义一个函数,接收三个参数返回一元二次方程
92 0
遍历寻找第一个满足条件的情况(7-10 电话聊天狂人
遍历寻找第一个满足条件的情况(7-10 电话聊天狂人
35 0
|
C++
分糖果(C++)
Alice 非常喜欢这些糖,她想要在遵循医生建议的情况下,尽可能吃到最多不同种类的糖。Alice 注意到她的体重正在增长,所以前去拜访了一位医生。医生建议 Alice 要少摄入糖分,只吃掉她所有糖的。枚糖的情况下,可以吃到糖的 最多 种类数。,返回: Alice 在仅吃掉。给你一个长度为 n 的整数数组。
93 0
|
C语言
接受一个整型值,按照顺序打印他的每一位(函数,递归方法)
接受一个整型值,按照顺序打印他的每一位(函数,递归方法)
149 0
接受一个整型值,按照顺序打印他的每一位(函数,递归方法)
打印100到200之间的素数(函数方法)
打印100到200之间的素数(函数方法)
79 0
打印100到200之间的素数(函数方法)