使所有数组元素相等的最小增量 - 其他操作数

时间:2018-01-03 19:05:08

标签: java arrays algorithm

我正在geeks网站的极客中阅读this个问题。

问题是如何找到数组中的最小移动数,以便所有元素都相等。

  

我们得到一个由n个元素组成的数组。在每次操作时你   可以选择任何一个元素并将剩余的n-1个元素增加1.你   必须使所有元素等于执行这样的操作   你想要的时间。找到所需的最少操作次数。

Examples:

Input : arr[] = {1, 2, 3}
Output : Minimum Operation = 3
Explanation : 
operation | increased elements | after increment
    1     |    1, 2            | 2, 3, 3
    2     |    1, 2            | 3, 4, 3
    3     |    1, 3            | 4, 4, 4

Input : arr[] = {4, 3, 4}
Output : Minimum Operation = 2
Explanation : 
operation | increased elements | after increment
     1    |    1, 2           | 5, 4, 4
     2    |    2, 3           | 5, 5, 5

该链接解释了我们必须使用公式minOperation = sum - (n * small)来得到答案,其中sum是数组中所有元素的总和,n是数组中元素的数量,small是数组中的最小元素。

能帮助我理解公式表示minOperation = sum - (n * small)的内容吗?以及它如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

编辑1: 为了更好地与此解决方案相关,最好提及用户 Dukeling 在评论中所说的内容。也就是说,增加除最大元素之外的所有其他元素类似于仅减少最大元素。

现在,想象一下你正试图平衡许多砖块。每列砖块可以是不同的级别:

为了对所有砖块进行调平,您总是选择最高的列并一次删除1块砖。

重复此过程,直到所有色谱柱均匀。 enter image description here

以黄色着色的是您需要移除以实现目标的砖块。(它们还表示为达到目标需要执行的操作数量)

为了计算红砖的数量,你使用一个类似于矩形区域的简单公式,即长x宽。

min x number of columns = all the red bricks (to be remained untouched)

sum of all bricks - number of red bricks = all yellow bricks 

因此你有公式:

minOperation = sum - (n * small) 

enter image description here

黄色数量=使所有数组元素相等所需的最小操作数。

答案 1 :(得分:0)

我已经使用二进制搜索解决了这个问题!

def main():
#codechef question SALARY 
t = input()
t = int(t)
while t > 0:
    n = input()
    n = int(n)
    val = list(map(int, input().split(" ")))
    initial_sum = sum(val)
    min_value = min(val)
    left = 0
    right = 10000000000
    while left <= right:
        mid = (left + right) // 2
        may_be = initial_sum + (mid * (n-1))
        mean = may_be / n
        diff = mean - min_value
        if diff == mid:
            break
        elif diff < mid:
            right = mid - 1
        else:
            left = mid + 1
    print(mid)
    t -= 1

如果名称 =='主要”:     main()

答案 2 :(得分:0)

使用一个简单的公式:

数组元素的总和-(数组的大小*数组中的最小元素)

示例 array = {1、2、3、4、5} n = 5 //数组大小

总和= 15,最小值= 1

ans =总和-(min * n)= 10