解析: 题目的意思我就不多说了。解题的思路我也不多说了。但我不得不说,我遇到了一个费解的问题,至今还未明白,
如果你知道(问题标注在代码处),请联系我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 }