解析: 基本的思路与以前做的垒积木类似。本题的难点在于浮点数运算。
题目中的平均数必须是保留两位小数。可用以下语句完成:ave = (int)ave + (double)((int)(ave * 100 + 0.5) % 100) / 100;
1 #include <stdio.h> 2 int main() 3 { 4 double h[1010], ave, move, temp; 5 int i, j, n; 6 while(scanf("%d", &n) == 1 && n){ 7 ave = 0.0; 8 move = 0.0; 9 for(i = 0; i < n; i++){ 10 scanf("%lf", &h[i]); 11 ave += h[i]; 12 } 13 ave /= n; 14 ave = (int)ave + (double)((int)(ave * 100 + 0.5) % 100) / 100; 15 for(i = 0; i < n; i++){ 16 if(h[i] == ave) /*正好合适,永久跳过*/ 17 continue; 18 if(h[i] < ave) /*缺少money,向后索取*/ 19 for(j = i + 1; j < n; j++){ 20 if(h[j] > ave){ /*有富余,取走*/ 21 temp = ave - h[i]; 22 if(h[j] - temp < ave){ 23 h[i] += h[j] - ave; 24 move += h[j] - ave; 25 h[j] = ave; 26 } 27 else{ 28 move += ave - h[i]; 29 h[j] -= ave - h[i]; 30 h[i] = ave; 31 break; 32 } 33 } 34 } 35 else /*money富余,向后分剩*/ 36 for(j = i + 1; j < n; j++){ 37 if(h[j] < ave){ 38 temp = ave - h[j]; 39 if(h[i] - temp > ave){ 40 move += temp; 41 h[j] = ave; 42 h[i] -= temp; 43 } 44 else{ 45 temp = h[i] - ave; 46 h[i] = ave; 47 h[j] += temp; 48 move += temp; 49 break; 50 } 51 } 52 } 53 } 54 printf("$%.2lf\n", move); 55 } 56 return 0; 57 }