【问题标题】:Minimum reallocations required to make all prefix sum >=0使所有前缀总和 >=0 所需的最小重新分配
【发布时间】:2021-12-08 23:57:06
【问题描述】:

给出一个整数数组,例如:10、-10、-1、-1、10。我必须找到最小的重新分配,以使数组的所有前缀总和> = 0。数组
中所有元素的总和被假定为非负数。在上面的示例中,我们可以将 -10 移动到数组的末尾,以使所有前缀和为正。不知道如何有效地解决这个问题。取一个数字并将其插入其他任何地方将被视为一次重新分配。 该问题将通过另一种类型的重新分配来解决:

  1. 任何负数都可以移到数组的末尾

【问题讨论】:

  • 在这种情况下什么是重新分配?
  • @harold 添加了重新分配的定义

标签: algorithm prefix-sum


【解决方案1】:

我们可以从左到右扫描,将到目前为止扫描的最小整数移动到 每次扫描整数的总和变为负数时结束。证据 想法是,如果我们将这个贪心算法的作用与任何 最优解 OPT,只要贪心和 OPT 移动了相同的数字 整数,贪心的总移动小于或等于(即,更大, 因为我们移动的是负数)而不是 OPT 的,所以贪心从不 采取行动使其落后于 OPT。

import heapq


def min_relocations(lst):
    relocations = 0
    heap = []
    total = 0
    for x in lst:
        heapq.heappush(heap, x)
        total += x
        if total < 0:
            relocations += 1
            total -= heapq.heappop(heap)
    return relocations

【讨论】:

  • @David 我已经更新了重新分配的定义;我错过了早些时候放它。我认为对于可以将负数移动到数组末尾的重新分配类型,大卫的算法会起作用,但不确定
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 2022-01-24
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
相关资源
最近更新 更多