BZOJ 1045 糖果传递(思维)】的更多相关文章

设第i个人给了第i+1个人mi个糖果(可以为负),因为最后每个人的糖果都会变成sum/n. 可以得到方程组 mi-mi+1=a[i+1]-sum/n.(1<=i<=n). 把方程组化为mn组成的形式,最后的结果就是求min(abs(mn)+abs(mn-a[i+1]+sum/n)....).可以看出这是一个分段函数. 且函数最值在mn取中位数的地方. # include <cstdio> # include <cstring> # include <cstdlib…
放一道数学题. Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=1000000,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数. Output 求使所有人获得均等糖果的最小代价. Sample Input 4 1 2 5 4 Sample Output 4 HINT n<=1000000,ai在int范围内. Solution 这道题也算是一个经典的绝…
首先我们假设平均数为ave 那么对于第1个人,我们假设他给第N个人K个糖果,第2个人给1,第3个人给2,第n个人给第n-1个人 那么对于第1个人给完n,第2个人给完1,第一个人不会再改变糖果数了,所以应该是ave 那么第一个人原来是a1,给n之后是a1-k,代价是k,第2个人给1,使1的糖果数是ave,所以应该 给ave-a1+k个,代价是abs(ave+k-a1)=abs(a1-k-ave),那么第2个人变成了a2+a1-k-ave个 第3个人需要给2个人ave-a2-a1+k+ave=2*a…
奇怪的式子.最后发现取中位数. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> #define maxn 1000500 using namespace std; ,ave; int main() { scanf("%lld",&n); ;i…
思路题/神奇的转化…… orz hzwer 或许这个思路可以从单行而非环形的递推中找到?(单行的时候,从左往右直接递推即可…… 感觉好神奇>_<脑残患者想不出…… P.S.话说在$n\leq 10^6$的时候读入优化效果好明显…… 题解: 首先,最终每个小朋友的糖果数量可以计算出来,等于糖果总数除以n,用ave表示. 假设标号为i的小朋友开始有Ai颗糖果,Xi表示第i个小朋友给了第i-1个小朋友Xi颗糖果,如果Xi<0,说明第i-1个小朋友给了 第i个小朋友Xi颗糖果,X1表示第一个小朋…
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多少个糖果(负的…
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…
题目链接:BZOJ 1045 Attention:数据范围中 n <= 10^5 ,实际数据范围比这要大,将数组开到 10^6 就没有问题了. 我们先来看一下下面的这个问题. 若 n 个人坐成一行,不围成圈,那么我们可以用 f[i] 来表示第 i 个人需要从第 i-1 个人那里获得多少个糖果.(这就是“均分纸牌”那道题) 当 f[i] < 0 时,表示第 i 个人需要给第 i-1 个人 | f[i] | 个糖果. 那么 f[i] = K - (A[i] - f[i+1]) ,其中 K 为平均分…
3293: [Cqoi2011]分金币 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 854  Solved: 476[Submit][Status][Discuss] Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Input 第一行为整数n(n>=3),以下n行每行一个正整数,按逆时针顺序给出每个人拥…
1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3502  Solved: 1623[Submit][Status][Discuss] Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数. Outpu…
1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2975 Solved: 1327 [Submit][Status][Discuss] Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 小朋友个数n 下面n行 ai Output 求使所有人获得均等糖果的最小代价. Sample Input 4 1 2 5 4 Sampl…
[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…
BZOJ1045和BZOJ3293一模一样两道题,在这里我用1045来讲. 1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3518  Solved: 1633[Submit][Status][Discuss] Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=987654321,表示小朋友的个数.…
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|…
escription 老师准备了一堆糖果, 恰好n个小朋友可以分到数目一样多的糖果. 老师要n个小朋友去拿糖果, 然后围着圆桌坐好, 第1个小朋友的左边是第n个小朋友, 其他第i个小朋友左边是第i-1个小朋友. 大家坐好后, 老师发现, 有些小朋友抢了很多的糖果, 有的小朋友只得到了一点点糖果, 甚至一颗也没有 , 设第i个小朋友有ai颗糖果. 小朋友们可以选择将一些糖果给他左边的或者右边的小朋友, 通过”糖果传递”最后使得每个小朋友得到的糖果数是一样多的, 假设一颗糖果从一个小朋友传给另一个…
1465: 糖果传递 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 277  Solved: 105[Submit][Status] Description 老师准备了一堆糖果, 恰好n个小朋友可以分到数目一样多的糖果. 老师要n个小朋友去拿糖果, 然后围着圆桌坐好, 第1个小朋友的左边是第n个小朋友, 其他第i个小朋友左边是第i-1个小朋友. 大家坐好后, 老师发现, 有些小朋友抢了很多的糖果, 有的小朋友只得到了一点点糖果, 甚至一颗也没有 ,…
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,…
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(…
[BZOJ1045][HAOI2008] 糖果传递 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数. Output 求使所有人获得均等糖果的最小代价. Sample Input 4 1 2 5 4 Sample Output 4 题解:面对环上的问题我们仍然考虑把环拆开 我们先不考虑n—…
题目描述 老师准备了一堆糖果, 恰好n个小朋友可以分到数目一样多的糖果. 老师要n个小朋友去拿糖果, 然后围着圆桌坐好, 第1个小朋友的左边是第n个小朋友, 其他第i个小朋友左边是第i-1个小朋友. 大家坐好后, 老师发现, 有些小朋友抢了很多的糖果, 有的小朋友只得到了一点点糖果, 甚至一颗也没有 , 设第i个小朋友有ai颗糖果. 小朋友们可以选择将一些糖果给他左边的或者右边的小朋友, 通过”糖果传递”最后使得每个小朋友得到的糖果数是一样多的, 假设一颗糖果从一个小朋友传给另一个小朋友的代价是…
糖果传递,一开始就想到了n^2的模拟贪心算法,但是一看,数据范围太大,好像只有O(N)能过...没啥方法,只好看题解,之后发现,woc,还有这种操作? 这个题直接可以用数学证明... 证明如下: 首先,最终每个小朋友的糖果数量可以计算出来,等于糖果总数除以n,用ave表示. 假设标号为i的小朋友开始有Ai颗糖果,Xi表示第i个小朋友给了第i-1个小朋友Xi颗糖果,如果Xi<,说明第i-1个小朋友给了第i个小朋友Xi颗糖果,X1表示第一个小朋友给第n个小朋友的糖果数量. 所以最后的答案就是ans=…
[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…
http://www.lydsy.com/JudgeOnline/problem.php?id=1045 白书上有讲 没ac的坑点在,数据范围n<=1,000,000 #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue&…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1045 费用流TLE. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define ll long long using namespace std; ; const ll INF=1e15; ,pre[N]…
Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1.Input 小朋友个数n 下面n行 aiOutput 求使所有人获得均等糖果的最小代价.Sample Input41254 Sample Output4数据规模30% n<=1000100% n<=1000000 说难又不难,我对数学题没什么感觉啊 首先,均分纸牌都做过吧(什么,没做过!?百度NOIP2002均分纸牌) 这个只是环形而已,为了把它变成环形,我们要知道a1给了…
题意 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 思路 假设平均数是x,且a1给an了k个(k<0说明是an给a1了-k个),那么总代价就可以算出来: an an+k a1-k a2 代价:|k| x a1+a2-x-k a3 代价:|a1-x-k| x a1+a2+a3-2x-k 代价:|a1+a2-2x-k| x 代价:|a1+a2+a3-3x-k| 令bi=sum(a1..i)-ix,则总代价=sum|bi-k|.易知k为中位数时此值…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 思路来自hzwer.. 设xi表示第i个人往左传递了xi个糖果. (如果小于0表示旁边的人给他了糖果. 则ans=∑|xi| 最后所有人的糖果数都变成sum/n->avg 则 a1-x1+x2 = avg a2-x2+x3= avg ... 然后可以用avg和x1来表示所有的x2...xn 比如 x2 = x1-(avg-a1) x3 = x1-(2avg-a1-a2) .... 会发现x1右边的式子都是常量. 且都是x1-ci…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1045 好像是贪心...但这是一个环... 看博客:http://hzwer.com/2656.html 真是神奇的构造...还是应该大胆地先把各种变量都设出来再处理. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespa…