/*
题目: 分金币 围着桌子坐n人 每人有一些金币,大家之间可以相互给钱,
最终使每个人拥有相同的金币。求最小移动金币个数。
考查数学知识:中位数的距离的问题,见“解题手册”P6页
其他没有难度,注意找规律。边学边记吧 谁让我笨了!
题型可以举一反三。注意。
*///AC
1 #include<stdio.h> 2 #include<string.h> 3 //#include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 const int M=1000010; 7 long long c[M],a[M]; 8 int main() 9 { 10 long long n,i,sum,m,x1,ct,f; 11 12 while(scanf("%lld",&n)!=EOF) 13 { 14 getchar();//不知道怎么一输入就多打印出来0之类的字符 runtime error了 只能getchar()吸收一下 15 c[0]=0;//谁能告诉我这是咋的了 16 sum=0; 17 ct=0; 18 for(i=1;i<=n;i++) 19 { 20 scanf("%11d",&a[i]); 21 getchar(); 22 sum+=a[i]; 23 } 24 m=sum/n; 25 for(i=1;i<n;i++) 26 { 27 c[i]=a[i]+c[i-1]-m;//这里是开大整型的关键 28 //关键 关系表达式 29 } 30 sort(c,c+n); 31 f=n/2; 32 x1=c[f]; 33 for(i=0;i<n;i++) 34 { 35 ct+=abs(x1-c[i]);//绝对距离 36 } 37 printf("%lld\n",ct); 38 } 39 return 0; 40 } 41 /* 42 3 43 100 44 100 45 100 46 4 47 1 48 2 49 5 50 4 51 52 */