[bzoj1045][洛谷p2512][haoi2008]糖果传递

秋千旁的蜂蝶~ 秋千旁的蜂蝶~     2022-10-16     519

关键词:

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_i) 个糖果
(l_i)(r_i) 都可以为负数)
显然 (l_i=r_{i-1}) ,特殊地 (l_1=r_n)
(p)为最终每个小朋友手中的糖果数
则有 (l_i+a_i-r_i=p) , 即 $ r_i=l_i+(a_i-p) $
而我们又有 (l_i=r_{i-1})
一直递归下去有 $ r_i=l_1+(a_1-p)+(a_2-p)+(a_3-p)+…+(a_i-p) $
最终答案为 (|r_1|+|r_2|+…+|r_n|)
我们可以记下 (a_i-p) 的前缀和为 (sum_i)
那么 (ans=|l_1+sum_1|+|l_1+sum_2|+…+|l_1+sum_n|)
绝对值是个美妙的东西,(|l_1+sum_i|) 可想为数轴上 (-l_i)(sum_i) 的距离
那么(ans)的最小值在 (-l_1)(sum_i) 中位数时取到

求出(sum_i)及其中位数后计算即可。


代码

#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

typedef long long ll;
const int N = 1000005;

int a[N];
ll sum[N],p;
int n;

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        p+=a[i];        
    }
    p=p/n;
    sum[0]=0;
    for(int i=1;i<=n;i++) 
        sum[i]=sum[i-1]+a[i]-p;
    
    sort(sum+1,sum+1+n);
    ll l=sum[n/2+1],ans=0; //注意:中位数为n/2+1而不是n/2
    for(int i=1;i<=n;i++)
        ans+=abs(sum[i]-l);
    printf("%lld
",ans);
    
    return 0;    
}

bzoj1045糖果传递题解递推乱搞就对了

BZOJ1045糖果传递题解【递推乱搞就对了1045:[HAOI2008]糖果传递TimeLimit: 10Sec  MemoryLimit: 162MBSubmit: 3505  Solved: 1626[Submit][Status][Discuss]Description  有n个小朋友坐成一圈,每人有ai个糖果 查看详情

bzoj1045:[haoi2008]糖果传递

1045:[HAOI2008]糖果传递TimeLimit:10Sec MemoryLimit:162MBSubmit:4344 Solved:2119[Submit][Status][Discuss]Description有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。Input第一行一个正整数nn&... 查看详情

bzoj1045糖果传递

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1045题解:  完全不求知怎么推导,于是引用hzw大犇的题解:  首先,最终每个小朋友的糖果数量可以计算出来,等于糖果总数除以n,用ave表示。  假设标号为i的小朋友开始... 查看详情

梅森数洛谷p1045(代码片段)

由于梅森数是一个巨大的数我们不能一个一个2来乘,由于只存最后五百位,我们就用高精乘的思想来做;第一位算位数证明方式如下:2?p与2?p-1具有相同位数,设2?p的位数等于k,我们知道10?n的位数为n+1,自己想想看,我们只要... 查看详情

bzoj1045糖果传递(代码片段)

真·水题。环形均分纸牌模板题。只需求出前缀和,然后取中位数求二重前缀和即可。1#include<cstdio>2#include<algorithm>3usingnamespacestd;4typedeflonglongLL;5constintN=1000010;6LLa[N],sum[N];7intmain()8intn;9scanf("%d",&n);10fo 查看详情

bzoj1045[haoi2008]糖果传递——贪心(代码片段)

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1045好像是贪心...但这是一个环...看博客:http://hzwer.com/2656.html真是神奇的构造...还是应该大胆地先把各种变量都设出来再处理。代码如下:#include<iostream>#include<cstdio>#include<c... 查看详情

bzoj1045[haoi2008]糖果传递

传送门很久以前写过的题,忘得一干二净。题解//Twenty#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<queue>#include< 查看详情

快速幂+分治(洛谷p1045麦森数noip2003)

形如的素数称为麦森数,这时一定也是个素数。但反过来不一定,即如果是个素数,不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是,它有909526位。麦森数有许多重要应用,它与完全数密切相关。任务:从... 查看详情

bzoj1045[haoi2008]糖果传递

环形均分纸牌问题。用A[i]表示糖果数,sum表示目标的糖果数量。用X[i]表示从i+1移动到i的糖果的个数(可+可-)。由此可以得到式子A[i]+X[i]-X[i-1]=sum。我们可以得到这样的n-1个方程(第n个可以由前n-1个推导)。但是这样不足以求... 查看详情

bzoj1045:[haoi2008]糖果传递(数论)

1045:[HAOI2008]糖果传递题目:传送门(双倍经验3293) 题解:  一开始想着DP贪心一顿乱搞,结果就GG了    十分感谢hzwer大佬写的毒瘤数论题解:  首先,最终每个小朋友的糖果数量可以计算出来,等于糖果... 查看详情

[bzoj1045][haoi2008]糖果传递数学

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1045我们假设每一个小朋友的代价为$x[i]$,每一次都从前面一个小朋友那里拿,这种贪心跟纸牌均摊很像,想一想很容易理解。设最后每个小朋友能得到$ave$个糖果,所以有$a[i]+x[i]-x... 查看详情

[bzoj]1045圆上的整点(haoi2008)

  数学题第二弹! Description  求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。Input  一个正整数r。Output  整点个数。SampleInput  4SampleOutput  4HINT  r<=2000000000 Solution  小C不想写题解啊啊... 查看详情

bzoj1045[haoi2008]糖果传递排序(代码片段)

题面题目传送门解法环形均分纸牌和这道题是一模一样的时间复杂度:(O(nlog))代码#include<bits/stdc++.h>#defineintlonglong#defineN1000010usingnamespacestd;template<typenamenode>voidchkmax(node&x,nodey)x=max(x,y);temp 查看详情

bzoj1045糖果传递

题目大意:把noip均分纸牌变成了环思路:基本与均分纸牌相同但是需要考虑的是起点的选择首先我们可以设i个人开始有ai个糖然后设第i个人给前一个人的糖果数为gi则a[i]-g[i]+g[i+1]=avg;avg为最终每个人的糖果数即平均值得到最终... 查看详情

bzoj1045[haoi2008]糖果传递

【链接】我是链接,点我呀:)【题意】在这里输入题意【题解】思路来自hzwer..设xi表示第i个人往左传递了xi个糖果。(如果小于0表示旁边的人给他了糖果。则ans=∑|xi|最后所有人的糖果数都变成sum/n->avg则a1-x1+x2=avga2-x2+x3=avg...然后... 查看详情

贪心bzoj1045:[haoi2008]糖果传递(代码片段)

很妙的贪心思考过程Description有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。Input第一行一个正整数nn<=1‘000‘000,表示小朋友的个数.接下来n行,每行一个整数ai,表... 查看详情

bzoj1045:[haoi2008]糖果传递&&bzoj3293:[cqoi2011]分金币

一道神奇的题。。看到做法是排序我的心是绝望的。。首先我们可以先求出每个小朋友应该得到的糖果数,就是平均值,然后ave-a[i]就代表要从其他小朋友那得到多少个糖果(如果是负数就是要送出糖果)然后求前缀和,往前面... 查看详情

bzoj-1045-[haoi2008]糖果传递(中位数原理)

Description有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。Input第一行一个正整数nn<=1‘000‘000,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的... 查看详情