UVA 11300 Spreading the Wealth

来源:互联网 发布:淘宝多久删除炒作评价 编辑:程序博客网 时间:2024/06/01 23:08

UVA - 11300


分金币问题,大白书上的一道题,具体的过程第一次看的感觉很神奇,后来边看边想,确实这个中位数求的很有道理。

这道题通过建模列n个方程,可以抽象成给定数轴上n个点,在数轴上的所有点中,中位数离所有点的距离之和最小。

想了想,假设最优点向中位数点左侧移动d距离,那么原来在左边的点距离之和减去a个d,原来在右边的点距离之和加上a个d.总距离不变。但是中位数和最优点之间的距离变大。所以当最优点就是中位数的时候,最优点和中位数的距离为0.达到最优。

注意这题要用long long和%lld.我用int没过,用%I64d也没过。


#include<stdio.h>#include<algorithm>#define N 1000005using namespace std;long long a[N],b[N];int n;int main(){        while(scanf("%d",&n)>0)        {                long long sum=0;                for(int i=1;i<=n;i++)                {                        scanf("%lld",&b[i]);                        sum+=b[i];                }                long long m=sum/n;                a[0]=0;                for(int i=1;i<n;i++)                        a[i]=a[i-1]+b[i]-m;                sort(a,a+n);                long long middle=a[n/2],ans=0;                for(int i=0;i<n;i++)                        ans+=abs(middle-a[i]);                printf("%lld\n",ans);        }        return 0;}


0 0
原创粉丝点击