[HAOI2008]糖果传递 结论题
题目描述
有\(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]糖果传递 结论题相关推荐
- bz10451045: [HAOI2008] 糖果传递
1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2958 Solved: 1319 [Submit][S ...
- bzoj 1045: [HAOI2008]糖果传递
1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4094 Solved: 1970 [Submit][S ...
- 【BZOJ】1045: [HAOI2008]糖果传递(中位数)
http://www.lydsy.com/JudgeOnline/problem.php?id=1045 白书上有讲 没ac的坑点在,数据范围n<=1,000,000 #include < ...
- BZOJ1045 HAOI2008糖果传递(贪心)
显然最后每个小朋友所拥有的糖果数就是糖果数总和的平均数.设该平均数为t. 环的问题一般断成链,但这个题似乎没有什么很好的办法在枚举断点的时候快速算出答案(我甚至不知道会不会有断点) 于是我们假装把他断 ...
- BZOJ 1045 [HAOI2008]糖果传递 ★(环形等分:中位数)
题意 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 思路 假设平均数是x,且a1给an了k个(k<0说明是an给a1了-k个),那么总代价就 ...
- [BZOJ1045][HAOI2008] 糖果传递(数学相关)
题目描述 传送门 题目大意:有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1.求使所有人获得均等糖果的最小代价. 题解 设第i个人会给第i+1个人 xi ...
- bzoj1045: [HAOI2008] 糖果传递
挺有趣的.观察题目环形?切掉一个跑贪心?O(n^2)超时了... 先计算m为每个最终糖果数量. 设An传给A1了k个糖果, 那么A1传给A2的糖果数为S1=k+A1-m,T1=A1-m 那么A2传给A ...
- luogu P2512 [HAOI2008]糖果传递
传送门 Time cost: 35min 环形均分纸牌 我们再回顾一下均分纸牌 1 scanf("%d",&n); 2 for(i = 1; i <= n; i++) ...
- P2512 [HAOI2008]糖果传递
传送门 算法 : 瞎搞...... 这种题是真的恶心.... 以下为一堆的结论和证明... (自己口胡的,比较细,实在不想看也可以直接看结论) 首先如果要让每个人最终的糖果一样多 1.那么肯定最终每个 ...
最新文章
- android读取剪切板的方法,Android复制粘贴剪切板内容的一种方法
- 测试keras和mxnet的速度
- 本地两台虚拟机构建NFS服务器和客户端
- 机器学习算法总结--决策树
- 树莓派4B (aarch64) 安装PyTorch 1.8 的可行方案
- PCL点云学习(1)——pcd文件的生成和读取
- python canvas画移动物体_Python:Tkinter的GUI设计——物体实时移动
- 连通性问题--Algorithms IN C读书笔记
- Apache整合Tomcat(转)
- python中的commands模块
- 网络空间安全复习归纳
- 【灰色系统】—— 灰色系统的定义及其理论内容
- lisp 计算三点的夹角_计算三点所形成的夹角的三种方法
- 直方图均衡化及算法步骤
- linux 蓝牙hci,实战Linux Bluetooth编程(三) HCI层编程
- java seek_java中seek()的用法,seek和seekfor有什么区别
- R6-1 Python人民币美元双向兑换 (10 分)习题解答
- Rsync命令参数以及配置使用
- unity 打砖块—休闲小游戏,摸鱼必备(完整代码)
- :after和:before用法
热门文章
- STM32单片机低功耗配置
- python 3.9特性,开发者应该知道的Python 3.9新特性
- python常用函数的用法_python3 文件操作常用函数用法示例
- Java通过cal.get(Calendar.MONTH)比真实月份少一个月
- 【bzoj3224】普通平衡树——treap
- Git 版本管理工具命令速查
- 学不会的JAVA,消不了的忧愁! 1
- linux中resize的含义,linux的resize2fs命令
- springboot中getOutputStream() has already been called for this response和java.io.FileNotFoundException
- Java面试题谷歌插件