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 <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <string>
#include <numeric>
#include <algorithm>
#include <functional>
#include <iterator>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <complex>
#include <ctime>

typedef long long LL;
const double pi = acos(-1.0);
const long long mod = 1e9 + 7;
using namespace std;

LL a[1000005];
LL c[1000005];

int main()
{
    //freopen("int.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int N;
    while(scanf("%d",&N) == 1)
    {
        LL sum = 0;
        for(int i = 1;i <= N;i++)
        {
            scanf("%I64d",&a[i]);
            sum += a[i];
        }
        LL M = sum / N;
        c[0] = 0;
        for(int i = 1;i < N;i++)
            c[i] = c[i - 1] + a[i] - M;
        sort(c,c + N);
        LL x1 = c[N / 2];
        LL ans = 0;
        for(int i = 0;i < N;i++)
            ans += abs(x1 - c[i]);
        printf("%I64d\n",ans);
    }
    return 0;
}
//a数组事实上能够不要
#include <iostream>
#include <sstream>
#include <iomanip>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <string>
#include <numeric>
#include <algorithm>
#include <functional>
#include <iterator>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <complex>
#include <ctime>

typedef long long LL;
const double pi = acos(-1.0);
const long long mod = 1e9 + 7;
using namespace std;

LL c[1000005];

int main()
{
    //freopen("int.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int N;
    LL M,sum;
    while(scanf("%d",&N) == 1)
    {
        sum = 0;
        LL a;
        c[0] = 0;
        for(int i = 1;i <= N;i++)
        {
            scanf("%lld",&a);
            sum += a;
            c[i] = sum;
        }
        M = sum / N;
        for(int i = 1;i < N;i++)
            c[i] -= M * i;
        sort(c,c + N);
        LL x1 = c[N / 2],ans = 0;
        for(int i = 0;i < N;i++)
            ans += abs(x1 - c[i]);
        printf("%lld\n",ans);
    }
    return 0;
}
时间: 2024-10-28 16:30:36

UVa 11300 - Spreading the Wealth的相关文章

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

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 - 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

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

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 di

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号来说,