bzoj1045: [HAOI2008] 糖果传递

挺有趣的。观察题目环形?切掉一个跑贪心?O(n^2)超时了。。。

先计算m为每个最终糖果数量。

设An传给A1了k个糖果,

那么A1传给A2的糖果数为S1=k+A1-m,T1=A1-m

那么A2传给A3的糖果数为S2=k+A1+A2-2*m ,T2=A1+A2-2*m

那么A3传给A4的糖果数为S3=k+A1+A2+A3-3*m ,T3=A1+A2+A3-3*m

...

那么An-1传给An的糖果数为Sn=k+A1+A2+A3+...+An-n*m ,Tn=A1+A2+A3+...+An-n*m

我们最终目的是让我们最终目的是让S总和越小越好。

看出来了什么,我们只需求出最适合的k值,那么k是什么S最小呢?

k=T的中位数的相反数时最短!!!利用数轴想想,很容易。

#include<bits/stdc++.h>
const int N=1000005;
typedef long long ll;
int a[N];
ll f[N];
int main(){
    int n;
    ll m=0,ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)scanf("%d",&a[i]),m+=a[i];
    m/=n;
    for(int i=1;i<=n;++i)f[i]=f[i-1]-m+a[i];
    std::sort(f+1,f+1+n);
    for(int i=1;i<=n;++i){
        ans+=abs(f[i]-f[(n+1)/2]);
    }
    printf("%lld",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/Dream-Runner/p/10131604.html

时间: 2024-11-08 22:48:50

bzoj1045: [HAOI2008] 糖果传递的相关文章

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

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|

[BZOJ1045] [HAOI2008] 糖果传递 (贪心)

Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=1000000,表示小朋友的个数.接下来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$向

【贪心】bzoj1045: [HAOI2008] 糖果传递

很妙的贪心思考过程 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数nn<=1'000'000,表示小朋友的个数. 接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数. Output 求使所有人获得均等糖果的最小代价. Sample Input 4 1 2 5 4 Sample Output 4 题目分析 注意到传递糖果时候传递给不相邻的人是不优的,但是如何决策传给相邻人多少糖果呢

[HAOI2008] 糖果传递

1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4184  Solved: 2026 [Submit][Status][Discuss] Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的 糖果的颗数. Ou

bzoj 1045: [HAOI2008] 糖果传递 贪心

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

P2512 [HAOI2008]糖果传递&amp;&amp;P3156 [CQOI2011]分金币&amp;&amp;P4016 负载平衡问题

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(

P2512 [HAOI2008]糖果传递 - 贪心+中位数【环形均分纸牌问题】

P2512 [HAOI2008]糖果传递 Sol: 环形均分纸牌问题 考虑最基本的均分纸牌问题,相当于将环从1与n之间断开. 令\(res_i\)表示第\(i\)个人达到平均值所用步数,ave$表示糖果的平均数. 则 \(res_1=a_1-ave\) \(res_2=a_2-ave+res_1=a_1+a_2+2*ave\) \(res_3=a_3-ave+res_2=a_1+a_2+a_3-3*ave\) \(\dots\) \(res_i=a_i-ave+res_{i-1}=\sum_{j

[bzoj1045][洛谷P2512][HAOI2008] 糖果传递

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_

【bzoj1045】[HAOI2008] 糖果传递

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