程序以查找我们可以通过完成一些python作业而获得的最大信用

假设我们有两个大小相同的列表,它们是截止日期和学分,它们表示课程分配。截止期限[i]表示分配i的截止日期,而功劳[i]表示分配i所获得的积分的数量。我们有一天可以完成任务,可以在截止日期之前或当天完成。我们不能同时分配多个作业。我们必须找到通过完成某些作业子集可以获得的最大信用。

因此,如果输入像截止日期= [1、2、2、2]个信用= [4、5、6、7],那么输出将是18,因为我们可以在第0天用信用5完成分配第1天以6学分分配作业,第3天以7学分完成分配作业。

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

  • a:=制作一对截止日期和积分,并根据积分的降序对它们进行排序

  • 如果a为空,则

    • 返回0

  • res:=大小列表(1 +截止日期的最大值)并用0填充

  • 回答:= 0

  • 对于a中的每个对(i,j)

    • 如果res [k]为0,则

    • res [k]:= 1

    • ans:= ans + j

    • 从循环中出来

    • 对于范围i中的k降低到0,减少1,

    • 返回ans

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

    例 

    class Solution:
       def solve(self, deadlines, credits):
          a = sorted(list(zip(deadlines, credits)), key=lambda x: x[1], reverse=True)
          if not a:
             return 0
          res = [0] * (max(deadlines) + 1)
          ans = 0
          for i, j in a:
             for k in range(i, -1, -1):
                if not res[k]:
                   res[k] = 1
                   ans += j
                   break
          return ans
         
    ob = Solution()deadlines = [1, 2, 2, 2]
    credits = [4, 5, 6, 7]
    print(ob.solve(deadlines, credits))

    输入值

    [1, 2, 2, 2], [4, 5, 6, 7]

    输出结果

    18
    猜你喜欢