解析:  题目的意思我就不多说了。解题的思路我也不多说了。但我不得不说,我遇到了一个费解的问题,至今还未明白,

     如果你知道(问题标注在代码处),请联系我344977843@qq.com。

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int n, k, i, j, ave, kase = 1;
 5     int h[55];
 6     while(scanf("%d", &n) == 1 && n){
 7         ave = 0;
 8         k = 0;
 9         for(i = 0; i < n; i++){
10             scanf("%d", &h[i]);
11             ave += h[i];
12         }
13         ave /= n;
14         for(i = 0; i < n; i++){
15             if(h[i] == ave)   /*正好合适,永久跳过*/
16                 continue;
17             if(h[i] < ave)      /*缺少积木,向后索取*/
18                 for(j = i + 1; j < n; j++){      
19                     /*****问题:为什么外围的大括号去掉就错误了************/
20                     if(h[j] > ave){  /*有富余,取走*/
21                         h[j]--;
22                         h[i]++;
23                         k++;
24                         if(h[i] == ave)     /*成功达到标准高度*/
25                             break;
26                         else             /*从这开始,继续取*/
27                             j--;
28                     }
29                 }
30             else              /*积木富余,向后分剩*/
31                 for(j = i + 1; j < n; j++){
32                     if(h[j] < ave){  /*缺少*/
33                         h[j]++;
34                         h[i]--;
35                         k++;
36                         if(h[i] == ave)     /*成功达到标准高度*/
37                             break;
38                         else             /*从这开始,继续分*/
39                             j--;
40                     }
41                 }
42         }
43         printf("Set #%d\n", kase++);
44         printf("The minimum number of moves is %d.\n\n", k);
45     }
46     return 0;
47 }