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;    }


	
				
		
原创粉丝点击