我正在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)
的内容吗?以及它如何解决这个问题?
答案 0 :(得分:4)
编辑1: 为了更好地与此解决方案相关,最好提及用户 Dukeling 在评论中所说的内容。也就是说,增加除最大元素之外的所有其他元素类似于仅减少最大元素。
现在,想象一下你正试图平衡许多砖块。每列砖块可以是不同的级别:
为了对所有砖块进行调平,您总是选择最高的列并一次删除1块砖。
以黄色着色的是您需要移除以实现目标的砖块。(它们还表示为达到目标需要执行的操作数量)
为了计算红砖的数量,你使用一个类似于矩形区域的简单公式,即长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)
黄色数量=使所有数组元素相等所需的最小操作数。
答案 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