题目描述

有\(n(n<1000000)\)个小朋友坐成一圈,每人有\(a_i\)个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为\(1\),求使所有人糖果数相等的最小代价。

暴力的做法比较显然,有\(30\)分,这里就不再赘述了。
推一波式子:先考虑一条链的情况,\(a[i]\)为原数组,\(b[i]\)为\(a[i]\)每项分别减掉平均数的数组,\(sum1[i],sum2[i]\)分别为\(a[i],b[i]\)的前缀和数组,\(ave\)为平均数。则\(ans\)可表示为\(\sum\limits_{i=1}^{n}|i*ave-sum1[i]|\),再化简得到\(\sum\limits_{i=1}^{n}|sum2[i]|\)。然后是环形的情况,断环为链的位置不同,会变化的量就是前缀和数组。假设断环的位置为\(p\),则前缀和变为\(sum2[k+1]-sum2[k],sum2[k+2]-sum2[k]...\),减掉重复部分就是\(sum2[k]-sum2[1],sum2[k]-sum2[2]...\),所以答案就是\(\sum\limits_{i=1}^{n}|sum2[k]-sum2[i]|\),结论就是\(sum2[k]\)为中位数时是最优的(证明以后再补吧)。照着式子写代码就好了。

#include <cstdio>
#include <algorithm>using namespace std;#define N 1000000int n;
long long sum[N+5], ave;int main() {scanf("%d", &n);long long t, ans = 0;for(int i = 1; i <= n; ++i) scanf("%lld", &t), ave += t, sum[i] = sum[i-1]+t;ave /= n;for(int i = 1; i <= n; ++i) sum[i] -= i*ave;nth_element(sum+1, sum+(n+1)/2, sum+n+1);for(int i = 1; i <= n; ++i) ans += abs(sum[(n+1)/2]-sum[i]);printf("%lld", ans);return 0;
}

转载于:https://www.cnblogs.com/dummyummy/p/9795849.html

[HAOI2008]糖果传递 结论题相关推荐

  1. bz10451045: [HAOI2008] 糖果传递

    1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2958  Solved: 1319 [Submit][S ...

  2. bzoj 1045: [HAOI2008]糖果传递

    1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4094  Solved: 1970 [Submit][S ...

  3. 【BZOJ】1045: [HAOI2008]糖果传递(中位数)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1045 白书上有讲 没ac的坑点在,数据范围n<=1,000,000 #include < ...

  4. BZOJ1045 HAOI2008糖果传递(贪心)

    显然最后每个小朋友所拥有的糖果数就是糖果数总和的平均数.设该平均数为t. 环的问题一般断成链,但这个题似乎没有什么很好的办法在枚举断点的时候快速算出答案(我甚至不知道会不会有断点) 于是我们假装把他断 ...

  5. BZOJ 1045 [HAOI2008]糖果传递 ★(环形等分:中位数)

    题意 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 思路 假设平均数是x,且a1给an了k个(k<0说明是an给a1了-k个),那么总代价就 ...

  6. [BZOJ1045][HAOI2008] 糖果传递(数学相关)

    题目描述 传送门 题目大意:有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1.求使所有人获得均等糖果的最小代价. 题解 设第i个人会给第i+1个人 xi ...

  7. bzoj1045: [HAOI2008] 糖果传递

    挺有趣的.观察题目环形?切掉一个跑贪心?O(n^2)超时了... 先计算m为每个最终糖果数量. 设An传给A1了k个糖果, 那么A1传给A2的糖果数为S1=k+A1-m,T1=A1-m 那么A2传给A ...

  8. luogu P2512 [HAOI2008]糖果传递

    传送门 Time cost: 35min 环形均分纸牌 我们再回顾一下均分纸牌 1 scanf("%d",&n); 2 for(i = 1; i <= n; i++) ...

  9. P2512 [HAOI2008]糖果传递

    传送门 算法 : 瞎搞...... 这种题是真的恶心.... 以下为一堆的结论和证明... (自己口胡的,比较细,实在不想看也可以直接看结论) 首先如果要让每个人最终的糖果一样多 1.那么肯定最终每个 ...

最新文章

  1. android读取剪切板的方法,Android复制粘贴剪切板内容的一种方法
  2. 测试keras和mxnet的速度
  3. 本地两台虚拟机构建NFS服务器和客户端
  4. 机器学习算法总结--决策树
  5. 树莓派4B (aarch64) 安装PyTorch 1.8 的可行方案
  6. PCL点云学习(1)——pcd文件的生成和读取
  7. python canvas画移动物体_Python:Tkinter的GUI设计——物体实时移动
  8. 连通性问题--Algorithms IN C读书笔记
  9. Apache整合Tomcat(转)
  10. python中的commands模块
  11. 网络空间安全复习归纳
  12. 【灰色系统】—— 灰色系统的定义及其理论内容
  13. lisp 计算三点的夹角_计算三点所形成的夹角的三种方法
  14. 直方图均衡化及算法步骤
  15. linux 蓝牙hci,实战Linux Bluetooth编程(三) HCI层编程
  16. java seek_java中seek()的用法,seek和seekfor有什么区别
  17. R6-1 Python人民币美元双向兑换 (10 分)习题解答
  18. Rsync命令参数以及配置使用
  19. unity 打砖块—休闲小游戏,摸鱼必备(完整代码)
  20. :after和:before用法

热门文章

  1. STM32单片机低功耗配置
  2. python 3.9特性,开发者应该知道的Python 3.9新特性
  3. python常用函数的用法_python3 文件操作常用函数用法示例
  4. Java通过cal.get(Calendar.MONTH)比真实月份少一个月
  5. 【bzoj3224】普通平衡树——treap
  6. Git 版本管理工具命令速查
  7. 学不会的JAVA,消不了的忧愁! 1
  8. linux中resize的含义,linux的resize2fs命令
  9. springboot中getOutputStream() has already been called for this response和java.io.FileNotFoundException
  10. Java面试题谷歌插件