HYSBZ-1045 糖果传递
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
假设当所有人获得均等的糖果的时候:
每个人手上的糖果的数量为\(ave\)
第\(i\)个人初始时的糖果数量为\(A_i\)
第\(i\)个人给了前一个人\(X_i\)个糖果(如果\(X_i\)是负数,代表前一个人实际上的给了第\(i\)个人\(X_i\)个糖果)
那么对于每个人,都满足等式
\]
然后可以列出n条等式
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_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 糖果传递的更多相关文章
- [BZOJ]1045 糖果传递(HAOI2008)
放一道数学题. Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=1000000,表示 ...
- BZOJ 1045 糖果传递(思维)
设第i个人给了第i+1个人mi个糖果(可以为负),因为最后每个人的糖果都会变成sum/n. 可以得到方程组 mi-mi+1=a[i+1]-sum/n.(1<=i<=n). 把方程组化为mn ...
- bzoj 1045糖果传递 数学贪心
首先我们假设平均数为ave 那么对于第1个人,我们假设他给第N个人K个糖果,第2个人给1,第3个人给2,第n个人给第n-1个人 那么对于第1个人给完n,第2个人给完1,第一个人不会再改变糖果数了,所以 ...
- BZOJ 1045 糖果传递
奇怪的式子.最后发现取中位数. #include<iostream> #include<cstdio> #include<cstring> #include< ...
- 【BZOJ-3293&1465&1045】分金币&糖果传递×2 中位数 + 乱搞
3293: [Cqoi2011]分金币 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 854 Solved: 476[Submit][Status] ...
- BZOJ 1045: [HAOI2008] 糖果传递 数学
1045: [HAOI2008] 糖果传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1045 Description 有n个小朋友坐 ...
- 【BZOJ 1045】 1045: [HAOI2008] 糖果传递
1045: [HAOI2008] 糖果传递 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n& ...
- bzoj 1045: [HAOI2008] 糖果传递 贪心
1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1812 Solved: 846[Submit][Stat ...
- BZOJ-1045 糖果传递 数学+递推
1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2975 Solved: 1327 [Submit][Sta ...
- 【数学】【HAOI2008】【BZOJ1045糖果传递】【BZOJ3293分金币】论数学的重要性
BZOJ1045和BZOJ3293一模一样两道题,在这里我用1045来讲. 1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec Memory Limit: 162 MB ...
随机推荐
- File类的基本概念与递归
一.File类 1.概念 File类:是文件和目录路径名的抽象表示形式. 即,Java中把文件或者目录(文件夹)都封装成File对象.也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这 ...
- VSCode package.json warning: Problems loading reference 'https://json.schemastore.org/package'...
报错内容 Problems loading reference 'https://json.schemastore.org/package': Unable to load schema from ' ...
- map,reduce,filter基础实现
#coding=gbk from operator import add # 导入加法 # map 函数名 , 序列对象 print(list(map(str,range(5)))) print(li ...
- 小甲鱼零基础汇编语言学习笔记第二章之寄存器(CPU工作原理,CPU内部通讯)
这一章主要介绍了CPU中的重要器件——寄存器,整个系列通篇是以8086CPU作为探讨对象,其它更高级的CPU都是在此基础之上进行的升级. 1.一个典型的CPU是由运算器.控制器.寄存器等器件组成, ...
- C/C++编程笔记:C语言入门知识点(二),请收藏C语言最全笔记!
今天我们继续来学习C语言的入门知识点 11. 作用域规则 任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量: 在函数或块内部的局部变量 ...
- 2020牛客暑期多校训练营 第二场 B Boundary 计算几何 圆 已知三点求圆心
LINK:Boundary 计算几何确实是弱项 因为好多东西都不太会求 没有到很精通的地步. 做法很多,先说官方题解 其实就是枚举一个点 P 然后可以发现 再枚举一个点 然后再判断有多少个点在圆上显然 ...
- mongoDB数据库原生配置
最近小冷在工作中使用到了mongoDB数据库,所以就简单的写了个demo,和大家简单分享下,如果大家也有想分享的东西或者需要分享的东西,生活或者其他都行,可以关注小冷公众号秦川以北或者加小冷微信qxy ...
- datagrip安装与破解
datagrip下载 从官网下载的dataGrip可以免费使用30天,如果已经破解过或者付费过的小伙伴可以跳过这个章节.对于未安装软件的小伙伴,博主这里收集了dataGrip的破解教程,扫描底部博主的 ...
- day16.内置方法与模块
一.内置方法 1.abs 绝对值函数 res = abs(-100) print(res) 2.round 四舍五入 (n.5 n为偶数则舍去 n.5 n为奇数,则进一!) ""& ...
- 老哥,您看我这篇Java集合,还有机会评优吗?
集合在我们日常开发使用的次数数不胜数,ArrayList/LinkedList/HashMap/HashSet······信手拈来,抬手就拿来用,在 IDE 上龙飞凤舞,但是作为一名合格的优雅的程序猿 ...