在线编程——最小搬动次数(python)

在线编程——最小搬动次数(python)

题目:

      有n个打包机器从左到右一字排开,上方有一个自动装置会抓取一批物品到每个打包机上,放到机每个器上的这些物品数量有多有少,由于物品数量不相同,需要工人将每个机器上的物品进行移动从而到达物品数量相等才能打包。每个物品重量太大,每次只能搬一个物品进行移动;为了省力,只能在相邻的机器上移动。请计算在搬动最小次数的前提下,使每个机器上的物品数量相等。如果不能使每个机器上的物品相同,返回-1。

———————————————————————————————————————————————————

例子1:

输入:[0,3,0]

输出:2

具体过程:[0,3,0]->[1,2,0]->[1,1,1]

———————————————————————————————————————————————————

例子2:

输入:[1,0,5]

输出:4

解释:[1,0,5]表示3个打包机器,且每个机器的物品数量分别为1,0,5;

          4表示搬动的最小次数

具体过程:[1,0,5]->[1,1,4]->[2,0,4]->[2,1,3]->[2,2,2],所以共搬动4次。

———————————————————————————————————————————————————

例子3:

输入:[1,2,3,4,5]

输出:10

具体过程:[1,2,3,4,5]->[2,1,3,4,5]->[3,0,3,4,5]->[3,1,2,4,5]->[3,2,1,4,5]->[3,3,0,4,5]

                 ->[3,3,1,3,5]->[3,3,2,2,5]->[3,3,3,1,5]->[3,3,3,2,4]->[3,3,3,3,3]

———————————————————————————————————————————————————

Python 代码,有问题望指正:

import sys

def AverageBoxes(arr):
    times = -1 #初始值为-1
    arrLen = len(arr)
    if arrLen<=1 or min(arr)<0 or sum(arr)<=0:
        return times
    elif arrLen>=2:
        if sum(arr)%arrLen!=0: #若不能整除,说明无法使每个机器上的物体个数相同
            return times
        else:
            avgnum = sum(arr)/arrLen #求平均数
            temp = 0
            for i in range(arrLen-1): #对前arrLen-1个机器上的物体进行处理
                if arr[i] == avgnum: #若第i个机器上的物体个数等于平均数目,则不作处理
                    continue
                while arr[i]>avgnum: #若第i个机器上的物体个数大于平均数目,这个过程较简单
                    arr[i]-=1
                    arr[i+1]+=1
                    temp+=1

                while arr[i]<avgnum: #若第i个机器上的物体个数小于平均数目,这个过程较复杂,难在实际情况不能出现负数!
                    if arr[i+1]==0: #当第二个数等于0时,本身加1,后面的那个数减1
                        arr[i+1] += 1
                        arr[i+2] -= 1
                        temp += 1
                    elif arr[i+1]!=0:
                        arr[i] += 1
                        arr[i + 1] -= 1
                        temp += 1

                times = temp
            return times

if __name__ == '__main__':
    try:
        while True:
            BoxNumbers = [int(t) for t in sys.stdin.readline().split()] #输入参数
            print(AverageBoxes(BoxNumbers)) #调用函数并输出
    except:
        pass

运行结果:


上面代码存在一个问题:搬动的过程中会出现负数,但不影响最终结果;对应部分的代码为

while arr[i] < avgnum:  # 若第i个机器上的物体个数小于平均数目,这个过程较复杂,难在实际情况不能出现负数!
    if arr[i + 1] == 0:  # 当第二个数等于0时,本身加1,后面的那个数减1
        arr[i + 1] += 1
        arr[i + 2] -= 1
        temp += 1
    elif arr[i + 1] != 0:
        arr[i] += 1
        arr[i + 1] -= 1
        temp += 1

这部分存在问题,有知道的大神还请指导一下,谢谢!


相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页