zoukankan      html  css  js  c++  java
  • uva11300 分金币(中位数)

    来源:https://vjudge.net/problem/UVA-11300

    题意:

       有n个人围成一圈,每个人有一定数量的金币,每次只能挪动一个位置,求挪动的最少金币使他们平分金币

    题解:

    蓝书p6

    令x1为1号给2号的金币数,负数代表反方向   x2为2号给3号的金币数      x3为3号给4号的金币数

    而a1-x1+xn=m(m为平均数)a2-x2+x1=m    a3-x3+x2=m

    我们要求的就是|x1|+|x2|+|x3|+...|xn|

    用x1表示x2,x3,x4

    ans=|x1|+|x1-G1|+|x1-G2|....

    x1到n个点的距离和最短时,就是正解

    而这个点==G[MID]

    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #define ll long long
    using namespace std;
    const int maxn=1000000+5;
    
    ll num[maxn];
    int main()
    {
    	int n;
      	while(scanf("%d",&n)!=EOF)
    	{
    	    ll  sum=0;
    		for(int i=1;i<=n;i++)
    		{
    			scanf("%lld",&num[i]);
    			sum+=num[i];
    		}
            ll M=sum/n;
    		num[1]=0;
    		for(int i=2;i<=n;i++)
    			num[i]=M-num[i]+num[i-1];
     		sort(num+1,num+1+n);
            int mid=n/2+1;
    	    ll ans=0;
    		for(int i=1;i<=n;i++)
    			ans+=abs(num[mid]-num[i]);
    		printf("%lld
    ",ans);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    清除浮动解决父元素高度塌陷问题
    canvas画动图
    vue实现列表的循环滚动
    localStorage读写操作
    angularJS快速入门
    python模块
    python函数式编程
    python高级特性
    Flask 快速入门
    JQuery Ajax
  • 原文地址:https://www.cnblogs.com/carcar/p/9084372.html
Copyright © 2011-2022 走看看