题目描述
原题来自:HAOI 2008
有 个小朋友坐成一圈,每人有 颗糖果。每人只能给左右两人传递糖果。每人每次传递一颗糖果的代价为 。求使所有人获得均等糖果的最小代价。
输入格式
第一行有一个整数 ,表示小朋友个数;
在接下来 行中,每行一个整数 。
输出格式
输出使所有人获得均等糖果的最小代价。
样例
样例输入
4
1
2
5
4
样例输出
4
题目链接 :https://loj.ac/problem/10010
思路:其实题目并不是特别严谨,比如如果不能使每个人拿同样多怎么办。暂且按可以拿同样多的苹果算吧:
学习大佬的思想:https://loj.ac/article/931
第一步肯定是算平均数 ave 了
我们假设 xi 是第 i 个人给 i-1个的苹果数
那么就有:
代码如下:
#include<bits/stdc++.h>
#define N 1000010
#define ll long long
using namespace std;
ll a[N],b[N],Sum[N];
int main()
{
int n;
scanf("%d",&n);
ll sum=0;
for(int i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
Sum[i]=Sum[i-1]+a[i];
sum+=a[i];
}
ll ave=sum/n;
for(int i=1; i<n; i++)
b[i]=Sum[n-1]-Sum[i-1]-(n-i)*ave;
b[n]=0;
sort(b+1,b+n+1);
ll x=b[(n+1)/2];
sum=0;
for(int i=1; i<=n; i++)
sum+=abs(x-b[i]);
printf("%lld\n",sum);
return 0;
}