程序查找在Python中完成K个任务的最长时间

假设我们有一个任务矩阵,其中每行有3个值。我们还有另一个值k。我们必须从任务中选择k行,将其称为S,以使以下总和最小化,并将总和返回为:(S [0,0],S [1,0],... S [k- 1,0])+(S [0,1],S [1,1],... S [k-1,1])的最大值+(S [0,2],S [1, 2],... S [k-1,2])我们也可以这样说:3列中的每列都对成本有所贡献,并且是通过以S中该列的最大值来计算的。列表是0。

因此,如果输入类似于task = [[2,3,3],[4,5,2],[4,2,3]],k = 2,则输出将为10,就像我们选择第一行和最后一行。总和为S = [[[2,3,3],[4,2,3]] max(S [0,0],S [1,0])= 4 + max(S [0,1 ],S [1,1])= 3 + max(S [0,2],S [1,2])= 3 = 10

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个功能util()。这需要B

  • 排序列表B

  • yheap:=对于范围为0至K-1的每个i,带有-B [i,1]的列表

  • 堆码

  • ans:= B [K-1,0] +(-yheap [0])

  • 对于范围在K到B的i,

    • x:= B [i,0]

    • 用-B [i,1]替换yheap

    • 设置的大小与K相同

    • y:= -yheap [0]

    • ans:= ans和x + y的最小值

  • 返回ans

  • 从主要方法中执行以下操作-

  • 如果A为空或K为0,则

    • 返回0

  • 排序列表A

  • B:=为范围为0至K-1的每个i组成对[A [i,1],A [i,2]]的列表

  • ans:= A [K-1,0] + B中每个(y,z)的y的最大值+ B中每个(y,z)的z的最大值

  • 对于范围在K到A的i

    • 将[A [i] [1],A [i] [2]]插入B

    • ans = ans和A [i,0] + util(B)的最小值

  • 返回ans

让我们看下面的实现以更好地理解-

示例

import heapq
class Solution:
   def solve(self, A, K):
      if not A or not K:
         return 0
      def util(B):
         B.sort()
         yheap = [-B[i][1] for i in range(K)]
         heapq.heapify(yheap)
         ans = B[K - 1][0] + (-yheap[0])
         for i in range(K, len(B)):
            x = B[i][0] heapq.heappushpop(yheap, -B[i][1])
            assert len(yheap) == K
            y = -yheap[0]
         ans = min(ans, x + y)
         return ans
         A.sort()
         B = [[A[i][1], A[i][2]] for i in range(K)]
         ans = A[K - 1][0] + max(y for y, z in B) + max(z for y, z in B)
         for i in range(K, len(A)):
            B.append([A[i][1], A[i][2]])
            ans = min(ans, A[i][0] + util(B))
         return ans
ob = Solution()tasks = [ [2, 3, 3], [4, 5, 2], [4, 2, 3] ]
k = 2
print(ob.solve(tasks, k))

输入值

tasks = [
[2, 3, 3],
[4, 5, 2],
[4, 2, 3] ],
k = 2

输出结果

10
猜你喜欢