让我们开始表单目标数组。这是什么?
拥有{7, 2, 2},我们想获得{4, 4, 3}。所以每个项目至少是3,一些顶级项目是3 + 1 == 4。
算法是
let sum = sum(original)
let rem = sum(original) % length(original) # here % stands for remainder
target[i] = sum / length(original) + (i < rem ? 1 : 0)
拥有original 和target
original: 7 2 2
target: 4 4 3
transfer: 3 2 1 (6 in total)
注意,那个
-
transfer[i] 只是一个绝对的区别:abs(original[i] - target[i])
- 我们对每个
transfer 计数 两次:一次我们减去,然后我们 添加。
所以答案是
sum(transfer[i]) / 2 == sum(abs(original[i] - target[i])) / 2
代码(c#):
private static int Solve(int[] initial) {
// Don't forget about degenerated cases
if (initial is null || initial.Length <= 0)
return 0;
int sum = initial.Sum();
int rem = sum % initial.Length;
int result = 0;
for (int i = 0; i < initial.Length; ++i)
result += Math.Abs(sum / initial.Length + ((i < rem) ? 1 : 0) - initial[i]);
return result / 2;
}
演示: (Fiddle)
int[][] tests = new int[][] {
new int[] {7, 2, 2},
new int[] {2, 2, 7},
new int[] {},
new int[] {2, 2, 2},
new int[] {1, 2, 3},
};
string report = string.Join(Environment.NewLine, tests
.Select(test => $"[{string.Join(", ", test)}] => {Solve(test)}"));
Console.Write(report);
结果:
[7, 2, 2] => 3
[2, 2, 7] => 4
[] => 0
[2, 2, 2] => 0
[1, 2, 3] => 1