Uva 11300 - Spreading the Wealth
/*
題目: 分金幣 圍著桌子坐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 */
posted on 2013-03-13 18:56 ACM_Someone like you 閱讀(231) 評論(0) 收藏 舉報
浙公網安備 33010602011771號