大体题意:
坐在圆桌上有n 个人,没人有一定数量的金币,你的目的是使得没个人的金币都一样,你的分金币方法是可以把手里的金币分给相邻的人,问最少分的数量!
思路:
很巧妙的一道题目,书上说的很详细,简单记录一下!
假设每个人的金币数量是a1,a2,a3,,,,an,
第一个人得到的金币数是 x1,
第二个得到的金币数是x2,,,,,,
依次类推:
会得到一个等式:(拿样例举例子)
a1-x4 + x1 = sum
a2-x1 + x2 = sum
a3-x2 + x3 = sum
a4- x3+x4 = sum
把x2,x3,x4用x1等量代换一下便会得到一个x1 减去一个常量的形式!
可以转换为 给你n 个点,在数轴上找一个点到这n 个点的距离之和最小!
很明显是中点!!
详细见代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1000000 + 7;
ll aaa(ll a){
if (a >= 0) return a;
return -a;
}
ll a[maxn];
int main(){
int n;
while (~scanf("%d",&n)){
ll sum = 0LL;
for (int i = 1; i <= n; ++i)scanf ("%lld",a+i), sum += a[i];
sum /= n;
for (int i = 2; i <= n; ++i){
a[i] = a[i-1] + sum - a[i];
}
for (int i = 1; i <= n; ++i) a[i] = -a[i];
sort(a+1,a+1+n);
int id = n + 1 >>1;
sum = 0LL;
for (int i = 1; i <= n; ++i){
sum += aaa(a[id] - a[i]);
}
printf("%lld\n",sum);
}
return 0;
}
/**
3
100
100
100
4
1
2
5
4
**/