UVA 11300 Spreading the Wealth (思路题目)

大体题意:

坐在圆桌上有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
**/



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值