均衡圆形阵列

时间:2013-05-08 09:21:31

标签: arrays algorithm

首先,这不是一个家庭作业问题,而是面试问题(阿里巴巴)。

最初的问题是“在仓库之间运输货物以使所有仓库具有相同的库存,所有这些仓库构成一个圆圈。”

我将问题抽象如下:

有一个圆形整数数组,现在需要均衡圆形数组(即,你需要使圆形数组中的每个元素具有相同的值) 。所以你必须从一个元素“移动一些价值”到另一个元素。

例如,有一个圆形数组:

c_array = {1, 2, 3}c_array[0] == 1c_array[1] == 2c_array[2] == 3

要均衡圆形数组,您必须将1c_array[2]“移动”到c_array[0]

有一些规则:

  1. 运动必须在相邻元素之间;
  2. 移动量必须为整数;
  3. k从一个元素移到另一个元素需要花费k;
  4. 另一个例子:

    c_array = {1, 2, 7, 6}c_array[0] == 1c_array[1] == 2c_array[2] == 7c_array[3] == 6

    解决方案是:

    2c_array[3]移至c_array[0],费用为2;

    3c_array[2]移至c_array[1],费用为3;

    1c_array[1]移至c_array[0],费用为1;

    总费用为6

    问题是找到成本最低的解决方案。如果没有有效的解决方案,请输出“NO”。详细介绍算法(只需解释算法,不需要编码)。

2 个答案:

答案 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)中的最大值来轻松解决。

现在,所有这些费用中的最小值将为我们提供答案。

如果您有任何疑问,请在下面评论,我将通过更多示例向您简要说明。