BZOJ 1045 糖果传递 题解 【递推乱搞就对了

1045: [HAOI2008] 糖果传递

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 3505  Solved: 1626
[Submit][Status][Discuss]

Description

  有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。

Input

  第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的
糖果的颗数.

Output

  求使所有人获得均等糖果的最小代价。

Sample Input

4
1
2
5
4

Sample Output

4

HINT

Source

这道题在codevs有类似的题目(均分纸牌),但是这个是一个环形的。

主要思路来源于hzw大神的博客(%%%%).

最好自己拿笔算一遍。

Ac代码

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int A[1000010];
int C[1000010];
long long sum,avr,ans;
int read(int &x){
    char c=getchar(),last;x=0;
    while(c<‘0‘||c>‘9‘)last=c,c=getchar();
    while(c>=‘0‘&&c<=‘9‘)x=(x<<1)+(x<<3)+c-‘0‘,c=getchar();
    if(last==‘-‘)x=-x;
    return x;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&A[i]),sum+=A[i];
    avr=sum/n;
    for(int i=2;i<=n;i++)
        C[i]=C[i-1]+A[i]-avr;
    sort(C+1,C+n+1);
    int m=C[(n>>1)+1];
    for(int i=1;i<=n;i++)
        ans+=abs(C[i]-m);
    printf("%lld",ans);

    return 0;
}
时间: 2024-11-05 19:26:48

BZOJ 1045 糖果传递 题解 【递推乱搞就对了的相关文章

bzoj 1045 糖果传递

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1045 题解: 完全不求知怎么推导,于是引用hzw大犇的题解: 首先,最终每个小朋友的糖果数量可以计算出来,等于糖果总数除以n,用ave表示. 假设标号为i的小朋友开始有Ai颗糖果,Xi表示第i个小朋友给了第i-1个小朋友Xi颗糖果,如果Xi<0,说明第i-1个小朋友给了第i个小朋友Xi颗糖果,X1表示第一个小朋友给第n个小朋友的糖果数量. 所以最后的答案就是ans=|X1| + |X2|

BZOJ 1088 扫雷Mine (递推)

题解:如果确定了第一排前两个数,那么剩下的数是唯一确定的,所以只要分情况讨论即可. #include <cstdio> #include <cstring> int n,a[10010],s[10010]; int ans(int x){ memset(a,0,sizeof a); if(x==1)a[1]=1; if(x==2)a[2]=1; if(x==3)a[1]=a[2]=1; for(int i=2;i<=n-1;i++){ a[i+1]=s[i]-a[i]-a[i

【BZOJ 4148】 4148: [AMPPZ2014]Pillars (乱搞)

4148: [AMPPZ2014]Pillars Time Limit: 5 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 100  Solved: 49 Description 给定一个n*m的矩形,其中有f个2*2的障碍物,其中任意两个障碍物中心之间的欧几里得距离至少为6, 且每个障碍物的中心到边缘的距离至少为3.请找到一条从左下角(1,1)出发经过所有没有障碍物的点各 一次的且最后回到左下角的回路. Input 第一行包含三个整数n,

P2512 [HAOI2008]糖果传递 题解 数学

题目描述 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 输入输出格式 输入格式: 小朋友个数n 下面n行 ai 输出格式: 求使所有人获得均等糖果的最小代价. 输入输出样例 输入样例#1: 复制 4 1 2 5 4 输出样例#1: 复制 4 首先,最终每个小朋友的糖果数量可以计算出来,等于糖果总数除以n,用ave表示. 假设标号为i的小朋友开始有Ai颗糖果,Xi表示第i个小朋友给了第i-1个小朋友Xi颗糖果,如果Xi<0,说明第i-1个小朋友

BZOJ 3823 定情信物 递推

题目大意:定义点为零维元素,线为一维元素,面为二维元素,空间为三维元素,以此类推,求n维立方体中各维元素都有多少 令f[i][j]为i维立方体内j维元素的个数 考虑n维立方体中的i维元素,将n维立方体拓展至n+1维空间时(觉得抽象的可以想象平面扩展成立方体) 原先的i维元素增加了一倍,同时原先的i-1维元素变为了i维元素 故有f[i][j]=f[i-1][j]*2+f[i-1][j-1] 经过一系列的推导(我不会怎么推,我是打表之后斜着找规律的),可以得到f[i][j]=2^(i-j)*C(i,

BZOJ 1177 [Apio2009]Oil(递推)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1177 [题目大意] 给出一个矩阵,从中选出3个k*k且不相交的矩阵,使得其总和最大 [题解] 只要处理四个方向的前缀最大值,就可以分类比较得到答案. [代码] #include <cstdio> #include <algorithm> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;i++) #d

BZOJ 3930: [CQOI2015]选数 递推

3930: [CQOI2015]选数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=3930 Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究.然而他很快发现工作量太大了,于是向你寻求帮助

bzoj 2656 [Zjoi2012]数列(sequence) 递推+高精度

2656: [Zjoi2012]数列(sequence) Time Limit: 2 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式: 小白作为一个数学爱好者,很快就计算出了这个数列的通项公式.于是,小白告诉小蓝自己已经做出来了,但为了防止小蓝抄作业,小白并不想把公式公布出来.于是小白为了向小蓝证明自己的确做出来了此题以达到其炫耀的目的,想出了

BZOJ 1197 花仙子的魔法(递推)

数学归纳法. dp[i][j]=dp[i][j-1]+dp[i-1][j-1]. # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> # include <queue> # include <stack> # include <map> # include <s