解析:  基本的思路与以前做的垒积木类似。本题的难点在于浮点数运算。

     题目中的平均数必须是保留两位小数。可用以下语句完成: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 }