Description

有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。

Input

第一行一个正整数nn<=1'000'000,表示小朋友的个数.
接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数.

Output

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

Sample Input

4
1
2
5
4

Sample Output

4

Solution

数学题

1045和3293是重题所以就放一起了,其实还有lrj蓝书上面的一道题也和这个一样(UVA的)

首先我们设每个人最后拥有的糖果数为$m$

那么很显然这个$m$是可以求出来的,$$m=\frac{\sum _{i=1}^{i<=n}A_i}{n}$$

再设一下,$xi$代表每个人传给了自己左边的人$xi$个糖果(对于$x1$,代表第一个人传给最后一个人$x1$个糖果(环形))

考虑第i个人,可以得到一个很显而易见的方程:$A_i - x_i + x_{i+1} = m$

为什么这个方程不用考虑左边的人传给这个人的情况?假设第$1$个人传给第$2$个人$3$个糖果,第$2$个人传给第$1$个人5个糖果,其实也就相当于,第$2$个人传给第$1$个人$2$个糖果,所以是不用考虑这个情况的(如果$1$传给$2$的牌比$2$传给$1$的多,那么$x2$则为负数)

同理可以得到一大堆的方程(其实就是把$1$~$n$分别代入上面的$i$)

我们可以尝试着解方程

然后会发现这方程是解不出来的

但是我们发现了一个点,可以拿x1表示这一大堆的其他的xi

现在我们设一个C数组,规定$C_i=C_{i-1}+A_i-m$

$a_1-x_1+x_2=m$化为$x_2=m-a_1+x_1=x_1-C_1$

同理,$a_2-x_2+x_3=m$化为

$x3$
$=m-a2+x2$
$=2*m-a2-a1+x1$
$=x1-C1-a2+m$
$=x1-C2$

于是我们就可以得到$n$个形似$xi=x1-Ci$的式子

好了我们在距离正解的路上已经迈出了一大步

考虑我们这$n-1$个等式能干啥

想想题目,我们想要传递的糖果数量尽可能少,也就是说,我们要让$\sum{abs(x)}$最小

然后再套一下之前的方程我们就可以把这个$\sum{abs(x)}$改写成$\sum{abs(x_1)+abs(x_1-C_1)+abs(x_2-C_2)···+abs(x_1-C_{n})}$

于是现在的问题就变成了,我们需要一个$x1$让$\sum{abs(x)}$最小

把这个玩意,映射到数轴上面,你就会发现一个神奇的东西

是的,就是中位数

怎么证明?

随便找一个点,假设这个点左边的点的数量多于右边的点的数量,那么肯定不是最优的,要向左移动(设它的左边有$l$个点,右边有$r$个点)(如果它向左移动了$t$个单位长度,假设还没碰到其他点,那么它距离左边的点少了$tl$的距离,距离右边多了$tr$的距离,总的距离事实上减少了$(l-r)t$个单位长度的距离,更优)

所以,使这个$\sum{abs(x)}$最小的$x_1$,一定会是$C$数组的中位数

所以得到这个$x1$之后,就可以推出这个$\sum{abs(x)}$的值了,答案也就出来了

嗯,这道题还卡$long \ long$,记得注意一下

挺好的一道数学题,挺思维的,代码难度也不大

#include <bits/stdc++.h>

using namespace std ;

#define ll long long
#define N 1000100 int n ;
ll a[ N ] , c[ N ] , sum = , ans = ; int main() {
scanf( "%d" , &n ) ;
for( int i = ; i <= n ; i ++ ) {
scanf( "%lld" , &a[ i ] ) ;
sum += a[ i ] ;
}
ll m = sum / n ;
for( int i = ; i <= n ; i ++ ) {
c[ i ] = c[ i - ] + a[ i ] - m ;
}
sort( c + , c + n + ) ;
ll t = c[ n & ? ( n + ) >> : n >> ] ;
for( int i = ; i <= n ; i ++ ) {
ans += abs( c[ i ] - t ) ;
}
printf( "%lld\n" , ans ) ;
return ;
}

BZOJ1045 [HAOI2008]糖果传递 && BZOJ3293 [Cqoi2011]分金币的更多相关文章

  1. bzoj1465 bzoj1045: [HAOI2008] 糖果传递&&bzoj3293: [Cqoi2011]分金币

    一道神奇的题..看到做法是排序我的心是绝望的.. 首先我们可以先求出每个小朋友应该得到的糖果数,就是平均值,然后ave-a[i]就代表要从其他小朋友那得到多少个糖果(如果是负数就是要送出糖果)然后求前 ...

  2. P2512 [HAOI2008]糖果传递&&P3156 [CQOI2011]分金币&&P4016 负载平衡问题

    P2512 [HAOI2008]糖果传递 第一步,当然是把数据减去平均数,然后我们可以得出一串正负不等的数列 我们用sum数组存该数列的前缀和.注意sum[ n ]=0 假设为链,那么可以得出答案为a ...

  3. BZOJ1045: [HAOI2008]糖果传递&BZOJ1465: 糖果传递&BZOJ3293: [Cqoi2011]分金币

    [传送门:BZOJ1045&BZOJ1465&BZOJ3293] 简要题意: 给出n个数,每个数每次可以-1使得左边或者右边的数+1,代价为1,求出使得这n个数相等的最小代价 题解: ...

  4. BZOJ3293: [Cqoi2011]分金币(数学)

    3293: [Cqoi2011]分金币 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1596  Solved: 969[Submit][Status ...

  5. bzoj1045: [HAOI2008] 糖果传递(数论)

    1045: [HAOI2008] 糖果传递 题目:传送门(双倍经验3293) 题解: 一开始想着DP贪心一顿乱搞,结果就GG了 十分感谢hzwer大佬写的毒瘤数论题解: 首先,最终每个小朋友的糖果数量 ...

  6. bzoj3293 [Cqoi2011]分金币&&bzoj1045 [HAOI2008]糖果传递

    Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Inpu ...

  7. (洛谷P2512||bzoj1045) [HAOI2008]糖果传递 || 洛谷P4016 负载平衡问题 || UVA11300 Spreading the Wealth || (洛谷P3156||bzoj3293) [CQOI2011]分金币

    bzoj1045 洛谷P4016 洛谷P2512 bzoj3293 洛谷P3156 题解:https://www.luogu.org/blog/LittleRewriter/solution-p251 ...

  8. [BZOJ1045] [HAOI2008] 糖果传递 (贪心)

    Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=,表示小朋友的个数.接下来n行,每行 ...

  9. BZOJ1045 [HAOI2008] 糖果传递

    Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=987654321,表示小朋友的个数 ...

随机推荐

  1. hadoop备战:yarn框架的简单介绍(mapreduce2)

    新 Hadoop Yarn 框架原理及运作机制 重构根本的思想是将 JobTracker 两个基本的功能分离成单独的组件,这两个功能是资源管理和任务调度 / 监控.新的资源管理器全局管理全部应用程序计 ...

  2. 从jvm来看,scala中的@究竟是个什么鬼?@模式匹配符号(scala 词法分析 语法分析常用)

    从jvm来看,scala中的@究竟是个什么鬼? 我也是初步尝试来看jvm的类文件,又是初次来分析@,如不对的地方,请各位指正! 先看一下@ 是个什么? object TestScala { def m ...

  3. ajax请求session失效重定向到登录页面

    在ajax请求的页面引入一个自定义的AjaxRedirect.js的文件 AjaxRedirect.js的代码如下: $(function(){ $.ajaxSetup({ type: 'POST', ...

  4. Centos上执行Shell的四种方式

    注意:我这里说的shell脚本是Bash Shell,其他类型的shell脚本不保证有效 1,方式一:进入shell文件所在目录 ./my.sh执行 ./my.sh ./的意思是说在当前的工作目录下执 ...

  5. Locust性能测试4-参数关联

    前言 前面[Locust性能测试2-先登录场景案例]讲了登录的案例,这种是直接传账号和密码就能登录了,有些登录的网站会复杂一点, 需要先从页面上动态获取参数,作为登录接口的请求参数,如[学信网:htt ...

  6. 使用Fiddler手机抓包https-----重要

    Fiddler不仅可以对手机进行抓包,还可以抓取别的电脑的请求包,今天就想讲一讲使用Fiddler手机抓包! 使用Fiddler手机抓包有两个条件: 一:手机连的网络或WiFi必须和电脑(使用fidd ...

  7. php传值,传地址,传引用的区别

    传值,   是把实参的值赋值给行参   那么对行参的修改,不会影响实参的值 传地址   是传值的一种特殊方式,只是他传递的是地址,不是普通的如int   那么传地址以后,实参和行参都指向同一个对象 传 ...

  8. cocos代码研究(7)即时动作子类学习笔记

    理论部分 即时动作是会立即被执行的动作.他们没有持续时间动作(ActionInterval)的持续时间属性.继承自 FiniteTimeAction.被 CallFunc, FlipX, FlipY, ...

  9. yii2之创建管理员

    第一步,使用迁移文件建表admin 先建立数据迁移文件: 小贴士,如果发现自己改错了,需要重新修改迁移文件 第二步,使用gii工具创建model 创建一个新的model,继承AdminAR,方便以后管 ...

  10. .NET 和 .NET框架概览

    什么是.NET .NET是为简化在第三代因特网的分布式环境下的应用程序的开发,基于开放互联网标准和协议之上,实现异质语言和平台高度交互性而构建的新一代计算和通信平台.其主要由三部分构成:.NET框架. ...