分配策略以最小化数组中的最大值

时间:2016-02-29 04:30:49

标签: algorithm

最近,我在解决另一个问题时遇到了这个问题。我自己有一个解决方案。但我对它的时间复杂性并不十分满意。所以,我转向你们,寻求更好的解决方案。问题如下:

假设有一个整数数组int arr[N]。我手中有一个整数值val,可以分发到arr。例如,我可以将arr[0]增加val,将arr[2]增加1,将arr[3]增加val - 1,依此类推。目标是在分发后最小化arr中的最大值。可能有多种解决方案,任何人都可以这样做。

我目前的解决方案如下。这是微不足道的,需要O(val)时间。我觉得存在更好的解决方案。

for (int i = 0; i < val; ++i) {
  // increase the minimum value in arr by 1
}

1 个答案:

答案 0 :(得分:4)

这是线性时间算法。首先尝试将所有内容增加到当前最大值。如果我们必须继续前进,尽可能均匀地分配其余部分。在未经测试的Python中:

def distribute(arr, val):
    maxarr = max(arr)
    for x in arr:
        val -= min(maxarr - x, val)
    return maxarr - (-val) // len(arr)

双减去愚蠢就是获得最高限度。