均衡数组所需的最小转换次数

时间:2013-01-01 12:06:48

标签: arrays algorithm

给出一组n个正元素(包括0)。我们只允许执行一个转换,即增加列表中的每个元素,除了一个。均衡此列表所需的最小转换次数是多少?

例如,n = 3,数组为1,2,3。我们需要进行3次这样的转换:

2,3,3 --> 3,3,4 --> 4,4,4

对于n = 4且列表为1,3,2,4,所需的最低转化次数为6

解决此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:15)

您实际上并不需要显示转​​换,而是查找所需转换的总数。

增加除一个元素以外的所有元素与减少一个元素基本相同(为了均衡所有元素)。

<强>策略:  减少所有非最小元素,直到它们等于最小元素。

例如。如果元素是{x1,x2,x3,x4 ...... xn} 转换次数为

let min = min{x1 .. xn}
for(int x : arr){
    // decrement x until x == m
}

转换总数

sum(k = 1 to n)x(k)−n*min{x1,…,xn}

示例运行:

For array = {1,2,3}
sum(k=1 to n) x(k) = (1 + 2 + 3) = 6
n = 3
min = 1
num_transformations = 6 - 3*1 = 3 transformations

答案 1 :(得分:4)

如果你意识到你的转换与从一个元素中减去1相同,并且作为最后一步向每个元素添加n,其中n是转换的数量,则更容易争论。例如1,2,3-> 1,2,2-> 1,1,2-> 1,1,1并且最后是4,4,4

这当然意味着您需要(使用数组,a_i是第i个元素,m是数组中的最小元素)sum_i(a_i - m)转换。

所以你的方法是

m=min(a)
for each (e in a) {
   while (e>m) {
      //transform so that e is reduced by 1
   }
}