UVa11300 Spreading the Wealth

本文介绍了一种解决环状平均分配问题的方法。该问题通过建立方程组并转化为单变量极值问题来解决,利用中位数计算出最短距离。代码采用C++实现,并在文章末尾附上了完整的源代码。

  原题链接:

  非常不错的一道题。以前做过一道水题与这道题类似,是一个从左往右的一个平均分配。而这道题是一个环状。

  要点:列出方程组,消元变为单变量极值问题,利用中位数求出最短距离。

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 #define N 1000005
 5 typedef long long LL;
 6 
 7 LL a[N], c[N];
 8 
 9 LL Labs(LL v){return v > 0 ? v : -v;}
10 
11 int main()
12 {
13     int n, i;
14     LL sum, avg, ans;
15     while(scanf("%d", &n) == 1)
16     {
17         for(sum = 0, i = 1; i <= n; i ++)
18         {
19             scanf("%lld", &a[i]);
20             sum += a[i];
21         }
22         
23         avg = sum / n;
24         for(i = 1; i < n; i ++)
25             c[i] = c[i - 1] + a[i] - avg;
26             
27         std::sort(c, c + n);
28         
29         LL tmp = c[n / 2];
30         for(ans = 0, i = 0; i < n; i ++)
31             ans += Labs(tmp - c[i]);
32             
33         printf("%lld\n", ans);
34     }
35     return 0;
36 }

转载于:https://www.cnblogs.com/huangfeihome/archive/2012/11/01/2750168.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值