题目描述

原题来自:HAOI 2008

有 n 个小朋友坐成一圈,每人有 a_i 颗糖果。每人只能给左右两人传递糖果。每人每次传递一颗糖果的代价为 1 。求使所有人获得均等糖果的最小代价。

输入格式

第一行有一个整数 n ,表示小朋友个数;

在接下来 n 行中,每行一个整数 a_i。

输出格式

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

样例

样例输入

4
1
2
5
4

样例输出

4

数据范围与提示

对于 30% 的数据,n<=1000;

对于 100% 的数据,n<=1e6,保证答案可以用 64 位有符号整数存储。

__________________________________________

很经典的题目,最初是在蓝书上看到的。

n个孩子围坐在一起,每个孩子手中有糖,通过传递让糖果平均。

每个孩子有a_i个糖果,传给下一个孩子b_i个糖果,使他们平均。当然可能是下一个孩子传给他,那么b_i为负数。

这样就是求sum(abs(b_i))

平均值ave是可以求出来的,那么

a_1+b_n-b_1=ave

a_2+b_1-b_2=ave

a_3+b_2-b_3=ave

...

a_n+b_n-1+b_n=ave

变形的

b_1=a_1+b_n-ave

b_2=a_2+b_1-ave

b_3=a_3+b_2-ave

......

b_n=a_n+b_n-1-ave

其中a_i和ave已知,设a_i-ave为c_i,上面的式子变为:

b_2=b_1-c_2

b_3=b_2-c_3=b_1-c_2-c_3

...

b_n=b_1-c_2-c_3-c_4-...-c_n

b_1=b_1-c_2-c_3-c_4-...-c_n-c_1

我们要求的是等号左侧的所有b的绝对值的最小值,也就是求等号右侧所有式子的绝对值和的最小值,而右侧只有b1是未知量。那么式子就变成了

|x-d|

x是未知量,而d是已知量。

那么就成了数轴上x点到d点的距离。

而d有好多个,求得是x。所以就变成了,求数轴上某一点数轴上n个已知点的距离之和最小。

这就用到了中位数。也就是把所有已知点排序,中间点的位置就是x点。

(奇数个已知点就是中间的,偶数个已知点,中间两个点间的所有的都符合要求)

__________________________________________

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1e6+10;
4 long long sz[maxn],ssz[maxn];
5 long long n,ave;
6 inline long long jdz(long long x,long long y)
7 {
8 return x>y?x-y:y-x;
9 }
10 int main()
11 {
12 scanf("%lld",&n);
13 for(int i=1;i<=n;++i)
14 {
15 scanf("%lld",&sz[i]);
16 ave+=sz[i];
17 }
18 ave/=n;
19 for(int i=1;i<=n;++i)
20 {
21 sz[i]-=ave;
22 ssz[i]=sz[i]+ssz[i-1];
23 }
24 sort(ssz+1,ssz+n+1);
25 long long b=ssz[(1+n)>>1];
26 long long ans=0;
27 for(int i=1;i<=n;++i)
28 ans+=jdz(b,ssz[i]);
29 cout<<ans;
30 return 0;
31 }

loj10010糖果传递的更多相关文章

  1. bzoj1045 糖果传递

    escription 老师准备了一堆糖果, 恰好n个小朋友可以分到数目一样多的糖果. 老师要n个小朋友去拿糖果, 然后围着圆桌坐好, 第1个小朋友的左边是第n个小朋友, 其他第i个小朋友左边是第i-1 ...

  2. 【BZOJ-3293&1465&1045】分金币&糖果传递×2 中位数 + 乱搞

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

  3. BZOJ-1045 糖果传递 数学+递推

    1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2975 Solved: 1327 [Submit][Sta ...

  4. BZOJ 1045: [HAOI2008] 糖果传递 数学

    1045: [HAOI2008] 糖果传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1045 Description 有n个小朋友坐 ...

  5. 【BZOJ 1045】 1045: [HAOI2008] 糖果传递

    1045: [HAOI2008] 糖果传递 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n& ...

  6. bzoj 1045: [HAOI2008] 糖果传递 贪心

    1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1812  Solved: 846[Submit][Stat ...

  7. BZOJ1465: 糖果传递

    1465: 糖果传递 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 277  Solved: 105[Submit][Status] Descriptio ...

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

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

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

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

随机推荐

  1. Java动态代理分析

    Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地制定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分配到委托对象上反射执行,配置执行过程中,开发 ...

  2. 【转】PANDAS 数据合并与重塑(concat篇)

    转自:http://blog.csdn.net/stevenkwong/article/details/52528616 1 concat concat函数是在pandas底下的方法,可以将数据根据不 ...

  3. [leetcode]79.Search Word 回溯法

    /** * Given a 2D board and a word, find if the word exists in the grid. The word can be constructed ...

  4. Ubuntu安装最新的SlickEdit软件--破解教程

    最近主要工作系统转到LInux上面来了,Slickedit的安装破解也费了些事,今天将过程整理一下做个记录. 说明:SlickEdit pro V21.03 Linux 64位实测可用,MAC实测可用 ...

  5. filebeat7.5.2 在 windows server 2008 R2 设置系统服务报错

    今天在windows server 2008 R2 设置filebeat为系统服务报错(在 windows 10 .windows server 2012.windows server 2019下安装 ...

  6. python之random 、os 、sys 模块

    一.random模块 import random print(random.random())#(0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3 ...

  7. 什么时候使用Get请求/POST请求?

    当请求无副作用时(如进行搜索),便可使用GET方法:当请求有副作用时(如添加数据行),则用POST方法. 一个比较实际的问题是:GET方法可能会产生很长的URL,或许会超过某些浏览器与服务器对URL长 ...

  8. Spring(2) --Bean相关

    你对Spring中的bean了解吗?都有哪些作用域(Scope)? Spring 官方文档对 bean 的解释是: In Spring, the objects that form the backb ...

  9. CTF常见编码及加解密(超全)

    @ 目录 前言 常见CTF编码及加解密 补充 ASCII编码 base家族编码 MD5.SHA1.HMAC.NTLM等类似加密型 1.MD5 2.SHA1 3.HMAC 4.NTLM 5.类似加密穷举 ...

  10. Ubuntu 18.04.4 LTS 更换国内系统源

    Ubuntu 18.04.4 LTS 更换国内系统源 1.1) 好习惯先做备份在干活: mv /etc/apt/sources.list /etc/apt/sources.list.bak 1.2) ...