题目描述

原题来自: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. easyui获取table列表中所有数据组装成json格式发送到后台

    jsp代码 var rows =$('#findAllRolestable').datagrid('getSelections'); var result = JSON.stringify(rows) ...

  2. 在项目中随手把haseMap改成了currenHaseMap差点被公司给开除了。

    前言 在项目中随手把haseMap改成了currenHaseMap差点被公司给开除了. 判断相等 字符串判断相等 String str1 = null; String str2 = "jav ...

  3. Java 从匿名内部类到Lambda表达式

    匿名内部类和Lambda表达式有很多类似之处,首先都是在使用的时候才对接口进行实现,只是Lambda接口中只能由一个需要被实现的方法. 所有的Lambda表达式都可以 由匿名内部类改写: interf ...

  4. Hadoop集群模式安装出现的若干问题

    一.域名解析问题 域名解析暂时失败问题 vim /etc/sysconfig/network 查看主机名 vim etc/hosts 配置IP地址与主机名 192.168.60.132 centos ...

  5. noip2016自测报告

    随便测了一下2016的提高组,发现自己还是太菜了... day1 T1:玩具谜题 一个模拟题,打挂了,只有95分,错的很傻逼 code: #include<bits/stdc++.h> u ...

  6. Ubuntu和UOS+mips64l龙芯处理器安装编译Openssl

    1.下载openssl开发包文件,我这里下载的是openssl-1.1.1f.tar.gz:并放在/data/home/dengchaoqun/openssl1.1.1目录下 2.终端切换到当前目录下 ...

  7. std::thread线程库详解(2)

    目录 目录 简介 最基本的锁 std::mutex 使用 方法和属性 递归锁 std::recursive_mutex 共享锁 std::shared_mutex (C++17) 带超时的锁 总结 简 ...

  8. 入门Kubernetes -基础概念

    一.Kubernetes概述 Kubernetes ,又称为 k8s(首字母为 k.首字母与尾字母之间有 8 个字符.尾字母为 s,所以简称 k8s)或者简称为 "kube" ,是 ...

  9. shelll中test命令的使用【转】

    Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大于等于 ...

  10. 一文带你探究Sentinel的独特初始化

    摘要:本系列通过作者对Redis Sentinel源码的理解,详细说明Sentinel的代码实现方式. Redis Sentinel 是Redis提供的高可用模型解决方案.Sentinel可以自动监测 ...