[HAOI2008]糖果传递
题目描述
有 nnn 个小朋友坐成一圈,每人有 aia_iai 个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为 111。
输入格式
小朋友个数 nnn,下面 nnn 行 aia_iai。
输出格式
求使所有人获得均等糖果的最小代价。
输入输出样例
样例输入1
4
1
2
5
4
样例输出1
4
说明 / 提示
对于 100%100\%100% 的数据 n≤106n\le 10^6n≤106。
Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, a[1000005], c[1000005], t, s, ans;
int jdz(int x)
{
return x < 0 ? -x : x;
}
signed main()
{
cin >> n;
for (int i(1); i <= n; ++i)
{
scanf("%d", &a[i]);
s += a[i];
}
t = s / n;
for (int i(2); i <= n; ++i)
c[i] = c[i - 1] + a[i] - t;
sort(c + 1, c + n + 1);
for (int i(1); i <= n; ++i)
ans += jdz(c[i] - c[n / 2]);
cout << ans;
return 0;
}

该博客讨论了一个关于糖果传递的问题,其中n个小朋友围成一圈,每个人拥有不同数量的糖果。目标是通过最少的传递次数使得每个小朋友获得相等数量的糖果。博主给出了一个C++代码实现,通过计算每个孩子与平均糖果数的差值,求得最小代价。算法思路是计算每个位置与中间位置糖果数的绝对差,累加得到总代价。
1050

被折叠的 条评论
为什么被折叠?



