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代码:
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); } }
相关文章推荐
- UVA11300 Spreading the Wealth (数学推导+中位数)
- UVa Spreading the Wealth-11300(数学推导+中位数)
- UVa - 11300 - Spreading the Wealth ( 数学推导 )
- UVa11300 Spreading the Wealth(数学问题)
- UVA 11300 Spreading the Wealth (数学推导 中位数)
- UVA 11300 SPREADING THE WEALTH 【数学】
- UVa 11300 Spreading the Wealth 数学题
- UVa 11300 Spreading the Wealth (数学推导-中位数)
- Uva 11300 分金币(数学推导和中位数)
- Uva---11300 F. Spreading the Wealth (数学推理)---与数列有关的最小值一般与中位数有关
- UVA 11300 - Spreading the Wealth(数学推导+中位数)
- Spreading the Wealth UVA - 11300 找规律+数学推导
- uva - 11300 - Spreading the Wealth(数学推导,中位数)
- uva 11300 Spreading the Wealth 数学方法(函数思想)
- Uva 11300 Spreading the Wealth(数学,中位数)
- Uva11300(数学)
- BZOJ 1045 (UVa 11300) 数学分析 + 结论
- UVA 11300 Spreading the Wealth (数学推导)
- 数学/思维 UVA 11300 Spreading the Wealth
- ACM: 数学题 uva 11300