您的位置:首页 > 其它

uva11300(数学)

2015-01-24 10:33 211 查看
题意:

n个人围成一圈,每个人都有一些硬币,,每个人只能给左右相邻的人硬币,问最少交换几个硬币,使每个人硬币一样多;

思路:

首先要求出平均数M,每个人的硬币为numi;那么对于1,他能给予4号x1个硬币,并从2号出得到x2个硬币,那么对于1可得numi - x1 + x2 = M;

同理可得numn-xn+x1 = M

就能得到:

x2 =x1-C1 (C1 = num1 - M)

x3 = M - num2 + x2 = 2M-A1-A2+x1 = x1-x2

...

最后所求为

|x1| + |x1-C1|+...+|x1-Cn-1|,要求这个最小,那么就是要x1为这些数的中位数;

求出x1,在计算和就行了;

AC代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long

const int N = 1000005;
ll num
;
ll c
;
int n;

int main () {
while(scanf("%d",&n) != EOF) {
ll sum = 0;
for(int i = 1 ; i <= n ; i++) {
scanf("%lld",&num[i]);
sum += num[i];
}
sum /= n ;
c[0] = 0;
for(int i = 1 ; i < n ; i++) {
c[i] = c[i - 1] + num[i] - sum;
}
sort(c , c + n);
ll x = c[n / 2];
ll ans = 0;
for(int i = 0 ; i < n ; i++) {
ll temp = x - c[i];
ans += fabs(temp);
}
printf("%lld\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: