在Python中移动以使数组中的所有元素相等

在Python中移动以使数组中的所有元素相等,python,math,Python,Math,我遇到一个问题,输入如下: 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)

我遇到一个问题,输入如下:

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.如果
1233
这种情况可能发生,那么最后它会显示如下
222
。我们从这个结果中得到了什么?如果这个保持模式是可能的,那么这是第一个条件

2.在所有的
索引值中
其中一些会留下一些值,而另一些会留下一些值。减去<代码>一个索引< /代码>和增量< <代码>另一个索引作为一个步骤,所以我们只考虑减量情况。那些即将离开并最终与
2
相等的人。所以
总步长
等于某些递减的索引值

这里我使用
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
不带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
更新:

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
至:

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
输出:

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

我们可以不使用Numpy来执行此操作吗?@Marki1990很抱歉,回复太晚,请立即检查解决方案