设xi为ai给ai+1的糖果数,xi可正可负,分别表示ai给ai+1和ai+1给ai
目标为使abs(xi) 的和最小
由于最终数量都相等,有如下式子
转化得
代入abs(xi)的和
其中c[i]=c[i-1]-avg+a[i]
由此可以转化成货舱选址问题,链接如下:
Acwing 104. 货仓选址(贪心+思维)_林十六要努力的博客-CSDN博客
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define LL long long
const int N=1e6+5;
LL c[N];
LL a[N];
int main(){
int n;
cin >> n;
LL sum=0;
for(int i=1;i<=n;i++)
{
cin >> a[i];
sum+=a[i];
}
LL avg=sum/n;
for(int i=2;i<=n;i++)
c[i]=c[i-1]-avg+a[i];//ci =ci+1 +avg-ai;
sort(c+1,c+n+1);
LL res=0;
int t=c[n/2+1];
for(int i=1;i<=n;i++)
res+=abs(c[i]-t);
cout << res;
}