首先,这不是一个家庭作业问题,而是面试问题(阿里巴巴)。
最初的问题是“在仓库之间运输货物以使所有仓库具有相同的库存,所有这些仓库构成一个圆圈。”
我将问题抽象如下:
有一个圆形整数数组,现在需要均衡圆形数组(即,你需要使圆形数组中的每个元素具有相同的值) 。所以你必须从一个元素“移动一些价值”到另一个元素。
例如,有一个圆形数组:
c_array = {1, 2, 3}
,c_array[0] == 1
,c_array[1] == 2
,c_array[2] == 3
。
要均衡圆形数组,您必须将1
从c_array[2]
“移动”到c_array[0]
。
有一些规则:
k
从一个元素移到另一个元素需要花费k
; 另一个例子:
c_array = {1, 2, 7, 6}
,c_array[0] == 1
,c_array[1] == 2
,c_array[2] == 7
,c_array[3] == 6
。
解决方案是:
将2
从c_array[3]
移至c_array[0]
,费用为2
;
将3
从c_array[2]
移至c_array[1]
,费用为3
;
将1
从c_array[1]
移至c_array[0]
,费用为1
;
总费用为6
。
问题是找到成本最低的解决方案。如果没有有效的解决方案,请输出“NO”。详细介绍算法(只需解释算法,不需要编码)。
答案 0 :(得分:5)
如果将圆形数组转换为图形,其中每个节点对应于某个数组元素,则节点的供给/需求等于元素的值与平均值之间的差异,每个节点连接到具有边缘,边缘容量的两个邻居是无限制的,每条边的成本是1,你得到的是最小成本流问题。
您可以在此页面找到几种解决方法:"Minimum Cost Flow, Part 2: Algorithms"。
答案 1 :(得分:0)
在昨天举行的hackwithinfy 2020第一轮中,我遇到了完全相同的问题,我能够成功提交此问题的解决方案并获得满分75分,尽管我没有代码,但我会如果您遇到任何困难,请尝试解释该算法,我一定会帮助您。
因此,基本上,我们需要做的是均衡数组的所有元素,因此我们将找到将整个数组转换为所有不同元素的成本,并打印所有成本中的最小值作为我们的答案。 / p>
例如1 1 2 3 如果这是我们的数组,我们将尝试找到将数组的所有元素替换为1的成本,然后将数组的所有元素转换为2并类似地转换为3的成本,那么我们将找到最小值这些费用。如我们所见,将数组的所有元素转换为1的开销最低。
现在要实现此目的,我使用了整数和向量的映射,即map> map1。现在,在输入时,我将数组的所有元素映射到数组中它们出现的向量,现在我发现相邻出现之间的差异也考虑了diff b / w last和first(因为数组是圆形的),并发现这些差异中的最大值,则如果差异为偶数,则成本为差异/ 2,否则为差异1/2。在某些极端情况下,当一个元素仅出现一次时,也可以通过采用(length-index-1)&(index)中的最大值来轻松解决。
现在,所有这些费用中的最小值将为我们提供答案。
如果您有任何疑问,请在下面评论,我将通过更多示例向您简要说明。