1045: [HAOI2008] 糖果传递 题目:传送门(双倍经验3293) 题解: 一开始想着DP贪心一顿乱搞,结果就GG了 十分感谢hzwer大佬写的毒瘤数论题解: 首先,最终每个小朋友的糖果数量可以计算出来,等于糖果总数除以n,用ave表示. 假设标号为i的小朋友开始有Ai颗糖果,Xi表示第i个小朋友给了第i-1个小朋友Xi颗糖果,如果Xi<0,说明第i-1个小朋友给了第i个小朋友Xi颗糖果,X1表示第一个小朋友给第n个小朋友的糖果数量. 所以最后的答案就是ans=|X1| + |X2|…
Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Input 第一行为整数n(n>=3),以下n行每行一个正整数,按逆时针顺序给出每个人拥有的金币数. Output 输出被转手金币数量的最小值. Sample Input 4 1 2 5 4 Sample Output 4 样例解释 设四个人编号为1,2,3,4.第3个人给第2个人2个金币(变成1,4,3,…
很妙的贪心思考过程 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数nn<=1'000'000,表示小朋友的个数. 接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数. Output 求使所有人获得均等糖果的最小代价. Sample Input 4 1 2 5 4 Sample Output 4 题目分析 注意到传递糖果时候传递给不相邻的人是不优的,但是如何决策传给相邻人多少糖果呢…
Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数. Output 求使所有人获得均等糖果的最小代价. Sample Input 4 1 2 5 4 Sample Output 4 HINT Source Solution 设$x[i]$表示$i+1$向$i$传的糖果数,$x[n]$表示$1$向$n$传的糖果…
显然最后每个小朋友所拥有的糖果数就是糖果数总和的平均数.设该平均数为t. 环的问题一般断成链,但这个题似乎没有什么很好的办法在枚举断点的时候快速算出答案(我甚至不知道会不会有断点) 于是我们假装把他断开了.假装现在我们已经知道了1号小朋友要给n号小朋友x颗糖果(可以为负).那么,2给1,3给2,4给3,等等等等,小朋友之间传递的糖果数都被确定了. 1号给了n号x颗后,其还剩a1-x颗,那么2号小朋友就要给1号t-(a1-x)=x-(a1-t)颗. 把1.2号看成整体,给了n号x颗后,其还剩a1+…
Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的 糖果的颗数. Output 求使所有人获得均等糖果的最小代价. Sample Input 4 1 2 5 4 Sample Output 4     正解:数学推导 解题报告: 参考神犇博客:http://blog.csdn.net/Le_ballo…
题意 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 思路 把|s[i]-s[k]|求和即可,s[i]是A的前缀和 s[k]为s数组的中位数时,总值最小 Code #include<bits/stdc++.h> using namespace std; ]; ]; int main() { ,t=; scanf("%lld", &n); ; i <= n; i++) { scanf("%d"…
Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数nn<=1'000'000,表示小朋友的个数. 接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数. Output 求使所有人获得均等糖果的最小代价. Sample Input 41254 Sample Output 4 Solution 数学题 1045和3293是重题所以就放一起了,其实还有lrj蓝书上面的一道题也和这个一样(UV…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1045 我们假设每一个小朋友的代价为$x[i]$,每一次都从前面一个小朋友那里拿,这种贪心跟纸牌均摊很像,想一想很容易理解. 设最后每个小朋友能得到$ave$个糖果,所以有$a[i]+x[i]-x[i+1]=ave$. 写出每一个形如这样的式子,可以消元得到$x[n]=x[1]+(n-1)*ave-sum[n-1]$. 我们令$c[i]=(i-1)*ave-sum[i-1]$,则我们最后所…
首先每个人一定分到的糖果都是所有糖果的平均数ave. 设第i个人给i-1个人Xi个糖果,则有Ai-Xi+X(i+1)=ave. 则A1-X1+X2=ave,A2-X2+X3=ave,A3-X3+X4=ave. X2=ave+X1-A1,A2-ave-X1+A1+X3=ave X3=2ave+X1-A1-A2 设Bi=sigma(A(1~i-1))-(i-1)*ave 则答案为|Bi-X1|的和的最小值,求个中位数即可 #include<bits/stdc++.h> #define ll lon…
bzoj1045 洛谷P4016 洛谷P2512 bzoj3293 洛谷P3156 题解:https://www.luogu.org/blog/LittleRewriter/solution-p2512 #include<cstdio> #include<algorithm> #include<cstring> #include<vector> using namespace std; #define fi first #define se second #…
一道神奇的题..看到做法是排序我的心是绝望的.. 首先我们可以先求出每个小朋友应该得到的糖果数,就是平均值,然后ave-a[i]就代表要从其他小朋友那得到多少个糖果(如果是负数就是要送出糖果)然后求前缀和,往前面延伸,将值想象成数轴上的点,数轴上任意点到其他的值的点的最小距离和就在中位数. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long lo…
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1045 分析:均分纸牌的环状版本. 先看线性的版本: 设f[i]表示第I位从第i+1位得到的糖果数 则f[i]=tot/n-a[i]+f[i-1] 对f[]求和就行了 对于环状版本也这么考虑,唯一特殊的就是a[1]可以给a[n],不妨设给了k个 那么f[n]=f[n]-k,那么往前推f[n-1]=f[n-1]-k,……,于是每个f[i]=f[i]-k 所以最后结果为singma(f[i…
[传送门:BZOJ1045&BZOJ1465&BZOJ3293] 简要题意: 给出n个数,每个数每次可以-1使得左边或者右边的数+1,代价为1,求出使得这n个数相等的最小代价 题解: %%%hzwer 参考代码: #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> using namespace std;…
Description 题目链接 Solution 这题跟数列的中位数有关, 具体证明见刘汝佳的蓝皮书里 Code #include <cstdio> #include <algorithm> #include <cmath> #define N 1000010 #define ll long long using namespace std; int n; ll sum,av,Ans,A[N],c[N]; inline int read(){ int x=0,f=1;…
[BZOJ1045][HAOI2008] 糖果传递 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数. Output 求使所有人获得均等糖果的最小代价. Sample Input 4 1 2 5 4 Sample Output 4 题解:面对环上的问题我们仍然考虑把环拆开 我们先不考虑n—…
[BZOJ1045][HAOI2008]糖果传递 题面 bzoj 洛谷 题解 根据题意,我们可以很容易地知道最后每个人的糖果数\(ave\) 设第\(i\)个人给第\(i-1\)个人\(X_i\)个糖果(\(i=1\)则表示第1个人个第\(n\)个人,\(X_i<0\)则表示\(i-1\)给\(i\)糖果\(-X_i\)) 由题,第一个人最后\(A_1-X_1+X_2=ave\)个 \(\Rightarrow x_2=ave-A_1+X_1\)(设\(C_1=A_1-ave\),下面同理) \(…
[BZOJ1045]糖果传递(贪心) 题面 BZOJ 洛谷 题解 秉承者娱乐精神,我们必须写一个费用流,并且相信信仰跑不过去. 于是写了一个\(zkw\)费用流如下:(您可以无视此份代码) #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<queu…
1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1812  Solved: 846[Submit][Status] Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 小朋友个数n 下面n行 ai Output 求使所有人获得均等糖果的最小代价. Sample Input 4 1 2 5 4 Sample Output 4…
[HAOI2008]糖果传递 题目描述 有 n n n 个小朋友坐成一圈,每人有 a i a_i ai​ 个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为 1 1 1. 输入格式 小朋友个数 n n n,下面 n n n 行 a i a_i ai​. 输出格式 求使所有人获得均等糖果的最小代价. 输入输出样例 样例输入1 4 1 2 5 4 样例输出1 4 说明 / 提示 对于 100 % 100\% 100% 的数据 n ≤ 1 0 6 n\le 10^6 n≤106. Code…
1045: [HAOI2008] 糖果传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1045 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 小朋友个数n 下面n行 ai Output 求使所有人获得均等糖果的最小代价. Sample Input 4 1 2 5 4 Sample Output 4 Hint 100% n<=987654321…
1045: [HAOI2008] 糖果传递 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数. Output 求使所有人获得均等糖果的最小代价. Sample Input 4 1 2 5 4 Sample Output 4     [分析] 一道经典题. 设xi为i给i-1多少个糖果(负的…
P2512 [HAOI2008]糖果传递 第一步,当然是把数据减去平均数,然后我们可以得出一串正负不等的数列 我们用sum数组存该数列的前缀和.注意sum[ n ]=0 假设为链,那么可以得出答案为abs( sum[ 1 ] )+abs( sum[ 2 ] )+...+abs( sum[ n ] ) 但是题目说的是环 我们设在第 k 个人处断开环成链. 那么答案为 abs( sum[ k+1 ] - sum[ k ] )+abs( sum[ k+2 ] - sum[ k ] )+...+abs(…
题目描述 老师准备了一堆糖果, 恰好n个小朋友可以分到数目一样多的糖果. 老师要n个小朋友去拿糖果, 然后围着圆桌坐好, 第1个小朋友的左边是第n个小朋友, 其他第i个小朋友左边是第i-1个小朋友. 大家坐好后, 老师发现, 有些小朋友抢了很多的糖果, 有的小朋友只得到了一点点糖果, 甚至一颗也没有 , 设第i个小朋友有ai颗糖果. 小朋友们可以选择将一些糖果给他左边的或者右边的小朋友, 通过”糖果传递”最后使得每个小朋友得到的糖果数是一样多的, 假设一颗糖果从一个小朋友传给另一个小朋友的代价是…
点此看题面 大致题意: 有\(n\)个小朋友坐成一圈,每人有\(a[i]\)个糖果.每人只能给左右两人传递糖果,传递一个糖果代价为1,求使所有人获得均等糖果的最小代价. 数学转换 这题其实是一道带有浓厚数学色彩的贪心题. 我们可以先用\(sum\)来统计\(a[i]\)之和,然后将\(sum\)除以\(n\),从而求出最后每个小朋友应该拥有的糖果的个数. 我们可以用\(s[i]\)来表示第\(i\)个人给第\(i+1\)个人的糖果数量(如果为负,表示第\(i+1\)个人给第\(i\)个人\(-s…
传送门:https://www.luogu.org/problemnew/show/P2512 题意: 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1.问使得每个人手中糖果个数相同的最小代价. 思路: 如果不是环.这道题要考虑前 i 个人 和前(i+1)个人的转移,前i个人必须从第i+1个人中拿到sum(1-i) - i * ave的个数.所以总费用就是n个前缀和相加(这里的前缀和已经减去平均值).因为是环,可以发现以第K个人开始记录的前缀和可以…
Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数nn<=1'000'000,表示小朋友的个数. 接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数. Output 求使所有人获得均等糖果的最小代价. Sample Input 4 1 2 5 4 Sample Output 4 想法 设第\(i\)个小朋友从他左边小朋友那里得到 \(l_i\) 个糖果,向他右边的小朋友传递 \(r_…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1045 好像是贪心...但这是一个环... 看博客:http://hzwer.com/2656.html 真是神奇的构造...还是应该大胆地先把各种变量都设出来再处理. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespa…
题目链接 环形均分纸牌. 设平均数为\(ave\),\(g[i]=a[i]-ave\),\(s[i]=\sum_{j=1}^ig[i]\). 设\(s\)的中位数为\(s[k]\),则答案为\(\sum |s[i]-s[k]|\) 博主太菜,无法给出证明. #include <cstdio> #include <algorithm> using namespace std; const int MAXN = 1000010; long long sum, ans, a[MAXN],…
题目描述 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. 分析: 设: 每个人最后拥有的金币数为m个, Ai代表第i个人有的金币数量, Xi代表i给了上一个人多少金币. 则: A1-X1+X2=m; 变形-->A1-X1+X2=m ==> X2=m+X1-A1=X1-(A1-m) A2-X2+X3=m ==> X3=m-A2+X2=2m-A2+X1-A1 所以 可得 X…