[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个小朋友得到的 糖果的颗数.

Output

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

Sample Input

4
1
2
5
4

Sample Output

4

设$x[i]$表示第$i$堆从前面一堆拿来的,那么$a[i]+x[i]-x[i+1]=ave$,然后把$x[2,3,\cdots,n]$全部用$x[1]$表示,可以发现$x[n]=x[1]+sum[n-1]-(n-1)*ave$,然后答案求的是$\sum\left|x[i]\right|$的最小值,求出中位数就行了

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1000000 + 10;
int a[maxn];
ll b[maxn], ave = 0, sum = 0, ans = 0;
int main(){
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        scanf("%d", a + i);
        ave += a[i];
    }
    ave /= n;
    sum = 0;
    for(int i = 1; i <= n; i++){
        b[i] = ave * (i - 1) - sum;
        sum += a[i];
    }
    sort(b + 1, b + n + 1);
    int mid = 1 + n >> 1;
    for(int i = 1; i < mid; i++) ans += b[mid] - b[i];
    for(int i = mid + 1; i <= n; i++) ans += b[i] - b[mid];
    printf("%lld\n", ans);
    return 0;
}
时间: 2024-10-20 09:23:25

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

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

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|

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] [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][洛谷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_

【BZOJ 1045】 [HAOI2008] 糖果传递

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 思路来自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

P2512 [HAOI2008]糖果传递

题目描述 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 输入输出格式 输入格式: 小朋友个数n 下面n行 ai 输出格式: 求使所有人获得均等糖果的最小代价. 输入输出样例 输入样例#1: 4 1 2 5 4 输出样例#1: 4 说明 对于100%的数据 n≤106 Solution: 本题和上篇博客一样,又是一道环形均分纸牌问题,只不过本题数据比较大,注意开$long\;long$和读入优化,基本就$OK$了. 代码: 1 #include

1045: [HAOI2008] 糖果传递

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4897  Solved: 2457[Submit][Status][Discuss] Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数nn<=1'000'000,表示小朋友的个数. 接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数. Output 求使所有人获得均等糖果的最小代价.