Spreading the Wealth uva 11300

A Communist regime is trying to redistribute wealth in a village. They have have decided to sit everyone around a circular table. First, everyone has converted all of their properties to coins of equal value, such that the total number of coins is divisible by the number of people in the village. Finally, each person gives a number of coins to the person on his right and a number coins to the person on his left, such that in the end, everyone has the same number of coins. Given the number of coins of each person, compute the minimum number of coins that must be transferred using this method so that everyone has the same number of coins.

The Input

There is a number of inputs. Each input begins withn(n<1000001), the number of people in the village.nlines follow, giving the number of coins of each person in the village, in counterclockwise order around the table. The total number of coins will fit inside an unsigned 64 bit integer.

The Output

For each input, output the minimum number of coins that must be transferred on a single line.

Sample Input

3

100

100

100

4

1

2

5

4

Sample Output

04

题意:n个人坐成一圈,每个人有一些钱,现在要平分这些钱,每个人只能把钱给周围的人,问最少要转移多少钱才能平分。

思路:推导,每个人最终得钱数可以算出为M,对于第i个人来说,Xi为他给上一个人的钱,如此一来 X(i+1) = M - Ai + Xi;X2 = M - A1 + X1 = X1 - C1.依次类推,Xi + 1 = X1 - Ci. Ci数组是可以递推出来的,然后答案就是X1 + |X1 - C1| + |X1 - C2| 。。。。 + |X1 - Cn -1|。中位数为最佳答案。

#include<cstring>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<set>
#define maxn 1000010
using namespace std;
long long c[maxn],a[maxn],m;
int main()
{
    int n;
    while(cin >> n)
    {
        long long sum = 0;
        for(int i=1;i<=n;i++)
        {
            cin >> a[i];
            sum += a[i];
        }
        m = sum / n;
        c[0] = 0;
        for(int i=1;i<=n;i++)
            c[i] = c[i-1] + a[i] - m;//跟新c[i]为x1-m,即第一个借出的钱减去平均值
        sort(c,c+n);//排序,贪心要用的
        long long x1 = c[n/2],ans = 0;//求出中位数
        for(int i=0;i<n;i++)
            ans += abs(x1-c[i]);//求最少值,所有点到中点的距离和是最小的
        cout << ans << endl;
    }
    return 0;
}
时间: 2024-10-21 06:59:49

Spreading the Wealth uva 11300的相关文章

UVA 之11300 - Spreading the Wealth

Problem A Communist regime is trying to redistribute wealth in a village. They have have decided to sit everyone around a circular table. First, everyone has converted all of their properties to coins of equal value, such that the total number of coi

UVa 11300 Spreading the Wealth(有钱同使)

UVa 11300 - Spreading the Wealth(有钱同使) Time limit: 6.000 seconds Description - 题目描述 A Communist regime is trying to redistribute wealth in a village. They have have decided to sit everyone around a circular table. First, everyone has converted all of

数学/思维 UVA 11300 Spreading the Wealth

题目传送门 1 /* 2 假设x1为1号给n号的金币数(逆时针),下面类似 3 a[1] - x1 + x2 = m(平均数) 得x2 = x1 + m - a[1] = x1 - c1; //规定c1 = a[1] - m,下面类似 4 a[2] - x2 + x3 = m ,x3 = m + x2 - a[2] = m + (m + x1 - a[1]) - a[2] = 2 * m + x1 - a[1] - a[2] = x1 - c2; 5 a[3] - x3 + x4 = m ,x4

Uva 11300 Spreading the Wealth 中位数

UVA - 11300 Spreading the Wealth Description A Communist regime is trying to redistribute wealth in a village. They have have decided to sit everyonearound a circular table. First, everyone has converted all of their properties to coins of equal valu

UVA 11300 Spreading the Wealth(技巧:中位数 推公式)

题目链接Spreading the Wealth A Communist regime is trying to redistribute wealth in a village. They have have decided to sit everyone around a circular table. First, everyone has converted all of their properties to coins of equal value, such that the to

Spreading the Wealth

Spreading the Wealth Time Limit: 6000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu [Submit]   [Go Back]   [Status] Description  F. Spreading the Wealth  Problem A Communist regime is trying to redistribute wealth in a village. They have h

UVa 11300 - Spreading the Wealth

分析: 把每一个人的个数表示出来,如第一个人:A1 - X1 + X2 = M 可得X2 =M - A1 + X1 = X1 - C1(令C1 = M - A1) 以此类推. 最后找到规律,转化为数轴上一个点到N个点之间距离的问题. 发现当x取得c的中位数时最小,累加距离得出答案. #include <iostream> #include <sstream> #include <iomanip> #include <vector> #include <

Uva 11300 Spreading the Wealth(贪心)

题目链接:https://vjudge.net/problem/UVA-11300 这道题的思路太神了,但很难想到是贪心. 用M表示每个人最终拥有的金币数. 首先假设有四个人.假设1号给2号3枚,2号又给1号5枚,那么实际上1号并没有给2号,而2号给了1号2枚.这样设$x_2$表示2号给了1号$x_2$枚.若$x_2<0$,那么就表示1号给了2号$-x_2$枚.这样我们就相当于在1号和2号之间连了一条边,表示1号2号之间硬币关系(注意是环形,所以$x_1$表示1号和4号之间的硬币关系). 假设1

UVA 11300 分金币

链接:https://uva.onlinejudge.org/index.php?///option=com_onlinejudge&Itemid=8&page=show_problem&problem=2275刚开始看到这题目,我是没什么想法的,没想到书上的技巧看起来如此的简单假设M为每个人都拥有的金币数,每个人的金币变化是左右相邻的人对其造成的影响假设这n个人构成一个环,先假设n=4,设x1指1号给4号多少金币,则x2代表2号给1号多少金币,其他的由此类推下去.则对于1号来说,