Uva 11300
来源:互联网 发布:淘宝自动发货平台 编辑:程序博客网 时间:2024/05/22 17:09
题目大意:给出一个整数n 然后n个人的钱。n个人围着一个圆桌每个人可以给旁边的人钱。最终的目的是所有人的钱一样多。数据保证可以实现。每有一个人给别人一块钱就是步数加一 现在要最少的步数实现。最终每个人的钱数假设为M=tot/n;每个人开始有的钱为Ai;Ci表示Ai-M这个题就是中位数的距离思想 n个人逆时针标号1-n首先用x1表示1号给n号的钱的数量同理x2表示2号给1号的钱那么我么可以列等式对于每个人 i Ai-xi+xi+1=M 就是说原来有的钱减去他给钱一个的钱加上后一个给他的钱等于M我们可以得出 x2 = M-A1+x1 =x1-C1; x3 = M-A2+x2 = x2-c2 =x1-c1-c2; .........我们最终希望的是x1 +x2 +xn的绝对值最小 也就是说|x1| +|x1-c1| + |x1-c1-c2| +.....+|x1-cn-1| 最小也就是 这n个点距离x1 的距离的绝对值最小#include<cstdio> #include<iostream>#include<algorithm>using namespace std;const int maxn =1000001+10;long long a[maxn],b[maxn],totle,average;int main(){ int n; while(scanf("%d",&n)!=EOF) { totle=0; for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); totle+=a[i]; } average =totle/n; b[0]=0; for(int i=1;i<n;i++) b[i]=b[i-1]-a[i]+average; sort(b,b+n); long long median=b[n/2],ans=0; for(int i=0;i<n;i++) ans+=abs(median-b[i]); printf("%lld\n",ans); } return 0; }