给出一组n个正元素(包括0)。我们只允许执行一个转换,即增加列表中的每个元素,除了一个。均衡此列表所需的最小转换次数是多少?
例如,n = 3
,数组为1,2,3
。我们需要进行3次这样的转换:
2,3,3 --> 3,3,4 --> 4,4,4
。
对于n = 4
且列表为1,3,2,4
,所需的最低转化次数为6
解决此问题的最佳方法是什么?
答案 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
}
}