您的位置:首页 > 其它

UVA 11300 Spreading the Wealth

2016-01-13 22:06 295 查看
UVA - 11300

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

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

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

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

#include<stdio.h>
#include<algorithm>
#define N 1000005
using namespace std;
long long a
,b
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: