首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最小增量数-使所有数组元素相等的其他操作

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

Stack Overflow用户
提问于 2018-01-03 19:05:08
回答 3查看 7K关注 0票数 4

我正在为极客网站阅读极客的问题。

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

给出了一个由n个元素组成的数组。在每个操作中,您可以选择任意一个元素,并将n-1元素的其余部分增加1。查找此操作所需的最小操作数。

代码语言:javascript
复制
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)来得到答案,其中和是数组中所有元素的总和,n是数组中的元素数,小元素是数组中最小的元素。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-03 19:48:44

编辑1:为了更好地联系这个解决方案,最好提到用户杜克林在他的评论中说了些什么。也就是说,增加除最大元素以外的所有其他元素类似于只减少最大元素。

现在,想象一下你正试图平整许多砖柱。每个砖柱可以是不同的层次:

为了平平所有的砖柱,你总是挑出最高的一栏,每次移除一块砖。

重复此过程,直到所有列都平平为止。

那些涂上黄色颜色的砖块是你为了达到目标而需要拆除的砖块。(它们也是指你需要执行的达到目标的操作数量)。

为了计算红砖的数量,你使用了一个类似矩形面积的简单公式,那就是长度x宽度。

代码语言:javascript
复制
min x number of columns = all the red bricks (to be remained untouched)

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

因此,您有一个公式:

代码语言:javascript
复制
minOperation = sum - (n * small) 

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

票数 12
EN

Stack Overflow用户

发布于 2019-07-21 18:40:22

使用一个简单的公式:

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

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

和= 15,最小=1

ans = sum - (min * n) = 10

均匀阵列 数组 砖块问题

票数 0
EN

Stack Overflow用户

发布于 2019-02-21 18:26:42

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

代码语言:javascript
复制
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':main()

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48083622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档