最近,我在解决另一个问题时遇到了这个问题。我自己有一个解决方案。但我对它的时间复杂性并不十分满意。所以,我转向你们,寻求更好的解决方案。问题如下:
假设有一个整数数组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
}
答案 0 :(得分:4)
这是线性时间算法。首先尝试将所有内容增加到当前最大值。如果我们必须继续前进,尽可能均匀地分配其余部分。在未经测试的Python中:
def distribute(arr, val):
maxarr = max(arr)
for x in arr:
val -= min(maxarr - x, val)
return maxarr - (-val) // len(arr)
双减去愚蠢就是获得最高限度。