AcWing 122.糖果传递

1.问题

有n个小朋友坐成一圈,每人有a[i]个糖果。

每人只能给左右两人传递糖果。

每人每次传递一个糖果代价为1。

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

输入格式

第一行输入一个正整数n,表示小朋友的个数。

接下来n行,每行一个整数a[i],表示第i个小朋友初始得到的糖果的颗数。

输出格式

输出一个整数,表示最小代价。

数据范围

1≤n≤1000000
数据保证一定有解。

输入样例:

4
1
2
5
4

输出样例:

4

2.解题思路

4{(6({U_YBWSAOK7_QZ_BMU.png

3.代码

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

using namespace std;

typedef long long LL;

const int N = 1000010;

int a[N], c[N];
int n;

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++)
        scanf("%d", &a[i]);
    
    LL sum = 0;
    for (int i = 1; i <= n; i ++)
        sum += a[i];
    int avg = sum / n;
    
    for (int i = n; i > 1; i --)
        c[i] = c[i + 1] + avg - a[i];
    c[1] = 0;
    
    sort(c + 1, c + 1 + n);
    int x1 = c[n / 2 + 1];
    LL ans = 0;
    for (int i = 1; i <= n; i ++)
        ans += abs(c[i] - x1);
    printf("%lld", ans);
    
    return 0;
}

雨天
0 声望3 粉丝

独自灿烂