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

假设当所有人获得均等的糖果的时候:

  1. 每个人手上的糖果的数量为\(ave\)

  2. 第\(i\)个人初始时的糖果数量为\(A_i\)

  3. 第\(i\)个人给了前一个人\(X_i\)个糖果(如果\(X_i\)是负数,代表前一个人实际上的给了第\(i\)个人\(X_i\)个糖果)

那么对于每个人,都满足等式

\[A_i-X_i+X_{(i+1)\%n}=ave
\]

然后可以列出n条等式

\[A_0-X_0+X_1=ave\\
A_1-X_1+X_2=ave\\
...\\
A_{n-1}-X_{n-1}+X_0=ave\\
\]

最终的答案应该是\(\sum_{i=0}^{n-1}|X_{i}|\)

实际上以上的其中一条等式能够由其他的\(n-1\)条等式得到.

不同的等式只有\(n-1\)条,未知数有\(n\)个,不能直接解.

假设\(X_0\)是已知的值,可以推出所有的\(X\)的值

\[X_1=ave-A_0+X_0=X_0-(A_0-ave)\\
X_2=ave-A_1+X_1=X_1-(A_1-ave)=X_0-(A_0-ave)-(A_1-ave)\\
...\\
X_{n-1}=X_0-\sum_{i=0}^{n-2}(A_i-ave)
\]

定义\(C_k=C_{k-1}-(A_i-ave)\)

那么\(|X_k|=|X_0-C_k|\)

如何让\(\sum_{i=0}^{n-1}|X_{i}|\)变得尽量小,

可以发现,\(|X_0-C_k|\)可以看作是数轴上\(X_0\)和\(C_k\)的距离,

把\(X_0\),\(C_1\),\(C_2\),...,\(C_{n-1}\),都列在一条数轴上,

找到其中的一个点,让这个点到其他所有的点的距离的和最小.

显然,这几个点之中最靠中间的点,就是到其他所有点的距离的和最小的点.

那么这个距离的和就是答案

应该如何假设\(X_0\)的值?

\(X_0\)的含义是第\(0\)个人给第\(n-1\)个人的糖果的数量.

实际上,从第二个人开始,每人给前一个人\(X_i\)个糖果,到最后第\(n-1\)个人手上的糖果数就应该是\(ave\)了.

所以\(X_0\)应该是\(0\).

#include<bits/stdc++.h>

using namespace std;
typedef long long ll; static ll n, sum, ave, mid, ans, a[1100100], c[1100100]; int main()
{
scanf("%lld", &n);
for(ll i = 0; i < n; ++i)
{
scanf("%lld", &a[i]);
sum += a[i];
}
ave = sum/n; c[0] = 0;
for(int i = 1; i < n; ++i)
{
c[i] = c[i-1]+a[i]-ave;
} sort(c, c+n);
mid = c[n/2];
for(int i = 0; i < n; ++i)
ans += abs(c[i] - mid);
printf("%lld\n", ans);
}

HYSBZ-1045 糖果传递的更多相关文章

  1. [BZOJ]1045 糖果传递(HAOI2008)

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

  2. BZOJ 1045 糖果传递(思维)

    设第i个人给了第i+1个人mi个糖果(可以为负),因为最后每个人的糖果都会变成sum/n. 可以得到方程组 mi-mi+1=a[i+1]-sum/n.(1<=i<=n). 把方程组化为mn ...

  3. bzoj 1045糖果传递 数学贪心

    首先我们假设平均数为ave 那么对于第1个人,我们假设他给第N个人K个糖果,第2个人给1,第3个人给2,第n个人给第n-1个人 那么对于第1个人给完n,第2个人给完1,第一个人不会再改变糖果数了,所以 ...

  4. BZOJ 1045 糖果传递

    奇怪的式子.最后发现取中位数. #include<iostream> #include<cstdio> #include<cstring> #include< ...

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

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

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

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

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

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

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

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

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

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

  10. 【数学】【HAOI2008】【BZOJ1045糖果传递】【BZOJ3293分金币】论数学的重要性

    BZOJ1045和BZOJ3293一模一样两道题,在这里我用1045来讲. 1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MB ...

随机推荐

  1. nonlocal 访问变量

    def counter(start = 0): def incr(): nonlocal start #分别保存每一个变量的临时值.类似yield start += 1 return start re ...

  2. Python raw_input() 函数

    python raw_input() 用来获取控制台的输入.高佣联盟 www.cgewang.com raw_input() 将所有输入作为字符串看待,返回字符串类型. 注意:input() 和 ra ...

  3. 5.20 省选模拟赛 求和 组合数的性质 EGF CRT

    LINK:求和 绝妙的一道题目.没做绝对亏了. 对于第一个subtask 考虑直接递推出组合数. 对于第二个subtask 考虑EGF 设两个EGF 都只含偶数项指标且系数为1的那种 一个到n一个到m ...

  4. webapp项目新建java class、webapp目录树结构

      上一篇中我们介绍了IDEA.maven新建webapp项目的两种方式,分别是:在命令行中用模板创建.直接在IDEA中选择骨架创建. 但都存在一个问题:目录树不完整.有些人会不知道接下来该如何创建j ...

  5. 代码扫描Sonar使用教程

    Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从多个维度检测代码质量: 可靠性 安全性 可维护性 覆盖率 重复率 通过插件形式,可以支持包括Java,C#,C/C++,PL/S ...

  6. Python 图像处理 OpenCV (16):图像直方图

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  7. IntelliJIDEA的安装、配置与使用

    引言: IDEA,全称 IntelliJ IDEA,是 Java 语言的集成开发环境,IDEA 在业界被公认为是 最好的 java 开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE 支持 ...

  8. java学习day01之String的特点,如何实现,并且有哪些重要方法?

    1.以主流的JDK版本1.8来说,String内部实际存储结构为char数组,源码如下: public final class String  implements java.io.Serializa ...

  9. Qt 应用程序打包成安装文件

    欢迎关注公众号: fensnote 文章目录 编译Release版本,拷贝依赖库文件 选择Release模式 使用windeployqt.exe命令提取用到的dll库 使用Inno Setup打包 下 ...

  10. Python 中 3 个不可思议的返回

    第一个:神奇的字典键 some_dict = {} some_dict[5.5] = "Ruby" some_dict[5.0] = "JavaScript" ...