我遇到了一个输入如下的问题:
5
1 1 1 1 6
预期输出为4
基本上,我们要做的是打印使所有5个值相等所需的最小移动次数。一次移动意味着减少一个位置并增加另一个位置。如果不能使它们都相等,我们打印-1。
我尝试了以下方法:
def solution(N, W):
counter=0
W.sort()
k=W[int(N/2)]
for i in range(0,N):
counter=counter+abs(W[i]-k)
if N%2==0:
tempC=0
k=W[int(N/2)-1]
for i in range(0,N):
tempC=tempC+abs(A[i]-k)
counter=min(counter,tempC)
return counter
答案是5。请分享您实现这一目标的功能。
让我们看看逻辑如何与您的输入一起工作。
5 1 1 1 1 6
1。如果1 2 1 3 3
这种情况可能,那么它最终显示为类似于2 2 2 2 2
。我们从这个结果Sum(INITAL_LIST) is equal to SUM(FINAL_LIST)
得到了什么,这是1st condition
,如果这个保持模式是可能的。
2.在所有的index-value
中,有些会留下一些值,有些会拿走。one-index
的递减和another-index
的递增是一个步骤,所以我们只考虑递减的情况。那些正在离开并最终成为平等的2
。所以total-step
等于一些递减的索引值。
为了便于操作,这里我使用了numpy
的矢量化特性。
代码:
import numpy as np
def solution(N, W):
if sum(W)%N !=0:
return -1
eq = sum(W)//N
step = np.array(W)-eq
step_sum = np.sum(step[step>0])
return step_sum
if __name__ == '__main__':
var_, list_ = input().split(maxsplit=1)
print(solution(int(var_), list(int(i) for i in list_.split())))
无数字:
更新:
step = np.array(W)-eq
step_sum = np.sum(step[step>0])
收件人:
step = [i-eq for i in W]
step_sum = sum(i for i in step if i>0)
输出:
5 1 1 1 1 6
4