UVa 11300 Spreading the wealth
程序员文章站
2022-06-02 21:22:00
...
题解:
显然我们这里可以设一些方程,因为我们最后要让每一个人的金币数相等,那么我们现在可以假设每个人向左边的人给了多少金币,比如我们令
那么我们显然可以得到如下方程
令
显然我们可以通过这些方程来进行求解,具体的方式是,我们把所有的
这里我们让
显然
所以把所有的
显然最后变成了
代码:
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
long long a[1000000+10],sum,M,c[1000000+10];
int n;
int main(){
while(scanf("%d",&n)!=EOF&&n){sum=0;
for(register int i=1;i<=n;i++)scanf("%lld",&a[i]),sum+=a[i];
M=sum/n;c[0]=0;
for(register int i=1;i<=n-1;i++)c[i]=c[i-1]+a[i]-M;
sort(c+0,c+n);long long num=c[n/2];
long long ans=0;for(register int i=0;i<=n-1;i++)ans+=abs(num-c[i]);
printf("%lld\n",ans);
}
return 0;
}
下一篇: uva 670 The dog task