zoukankan      html  css  js  c++  java
  • Uva11300 Spreading the Wealth

    设第i个人需要给第i+1个人的金币数为xi(xi为负代表收到钱),列出一大堆方程。

    设第i个人给第i-1个人的钱为xi(xi<0表示第i-1个人给第i个人钱)。计算出最后每个人应该有的钱m,解方程得xi=x1-(a1+a2+ … +a(i-1)-(i-1) * m)=x1-ti。 
    答案就是让|x1-t1|+|x1-t2|+…+|x1-tn|最小,所以x1应该取这些t中的中位数。      by sdfzyhx

     1 /* UVa11300 - Spreading the Wealth */
     2 #include<cstdio>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 long long x,n;
     8 long long a[1000100],c[1000100];
     9 int main(){
    10     int i,j;
    11     while(scanf("%d",&n)==1){
    12         long long sum=0;
    13         long long ans=0;
    14         for(i=1;i<=n;i++){
    15             scanf("%lld",&a[i]);
    16             sum+=a[i]; 
    17         }
    18         sum/=n;
    19         c[0]=0;
    20         for(i=1;i<n;i++){
    21             c[i]=c[i-1]+a[i]-sum;//C 
    22         }
    23         sort(c,c+n);
    24         x=c[n/2];
    25         for(i=0;i<n;i++)ans+=abs(x-c[i]);
    26         printf("%lld
    ",ans);
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    SpringBoot启动配置原理
    SpringBoot和web开发
    SpringBoot和日志
    SpringBoot入门
    Docker仓库
    Docker Swarm
    Docker相关概念
    Docker服务编排
    Dockerfile
    Docker应用部署
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6039654.html
Copyright © 2011-2022 走看看