這是 UVa 591 / POJ 1477 等 OJ 的經典題目。Bob 有 n 堆磚塊,高度各異。想將磚塊搬移使所有堆高度相同,求最少搬移磚塊數。條件:總磚塊數可被 n 整除,n ≤ 50,高度 ≤ 100。輸入多組測資,n=0 結束。
avg = sum / n。h[i] > avg 則 moves += h[i] - avg。Set #k、The minimum number of moves is X.、空行。#include <stdio.h>
int main() {
int n, i, sum, average, moves, set = 1;
int h[100];
while (scanf("%d", &n) == 1 && n != 0) {
sum = moves = 0;
for (i = 0; i < n; i++) scanf("%d", &h[i]);
for (i = 0; i < n; i++) sum += h[i];
average = sum / n;
for (i = 0; i < n; i++)
if (h[i] > average) moves += h[i] - average;
printf("Set #%d\n", set++);
printf("The minimum number of moves is %d.\n\n", moves);
}
return 0;
}

輸入: 6 5 2 4 1 7 5 0 輸出: Set #1 The minimum number of moves is 5.
時間 O(n),空間 O(n),極其高效。