美文网首页
描述分工合理的步骤

描述分工合理的步骤

作者: Python_Camp | 来源:发表于2022-10-13 10:36 被阅读0次

    描述分工合理的步骤

    我们有一大堆工作要做,所有的工作都被分配了若干工作,工作量将是一个整数,可能是正数、负数或零。

    吉姆和鲍勃的工作是做所有的工作,但是我们需要找到容器中可以进行分配的位置,这样吉姆和鲍勃就可以有最平均的工作量来执行。

    你的任务是写一个函数,确定为Jim和Bob分担工作量的地方,它将被提供一个难度评级的容器,你必须返回一个元组/数组,其中包含(分担的最佳位置,两个总工作量的差值)。如果没有提供工作负载,则返回(None,None)

    实例
    我们要分割的工作负载如下。

    split_workload([1, 6, 2, 3, 5, 4, 1])
    

    如果我们在每个位置尝试切割,那么。

      分配吉姆的工作 鲍勃的工作    比率 差异
    0 [], [1, 6, 2, 3, 5, 4, 1] 0:22 22
    1 [1] [6, 2, 3, 5, 4, 1] 1:21 20
    2 [1, 6] [2, 3, 5, 4, 1] 7:15 8
    3 [1, 6, 2] [3, 5, 4, 1] 9:13 4
    4 [1, 6, 2, 3] [5, 4, 1] 12:10 2
    5 [1, 6, 2, 3, 5] [4, 1] 17:5 12
    6 [1, 6, 2, 3, 5, 4] [1] 21:1 20
    7 [1, 6, 2, 3, 5, 4, 1] [] 22:0 22
    

    正如你所看到的,当我们在第4位分割时,我们得到了最均匀的分割,只有2的差异。

    因此,对于我们的例子,结果将是。

    split_workload([1, 6, 2, 3, 5, 4, 1]) -> (4, 2)
    

    如果你的答案在O(n)时间和内存限制下运行,你会得到自我奖励的分数。

    列表算法

    1st. solution

    def split_workload(workload):
        if not workload: return None, None
        
        diff = sum(workload)    
        best_i, best_diff = None, float('inf')
        
        for i, work in enumerate(workload):
            if abs(diff) < best_diff:
                best_i, best_diff = i, abs(diff)
            
            # 每右移1步,左右两边的工作量之差
            # 减少 2*workload[i]
            diff -= 2*work
        
        return best_i, best_diff
    

    2nd. solution

    def split_workload(workload):
        if not workload: return (None, None)
        diff = [0,float('inf')]
        for i in range(len(workload)):
            d = sum(workload[:i]) - sum(workload[i:])
            if abs(d) < diff[1]:
                diff[0],diff[1] = i,abs(d)
    
        return tuple(diff)
    

    本文由mdnice多平台发布

    相关文章

      网友评论

          本文标题:描述分工合理的步骤

          本文链接:https://www.haomeiwen.com/subject/hfhfzrtx.html