【问题标题】:Maximum number of tasks to be performed要执行的最大任务数
【发布时间】:2021-09-16 10:01:06
【问题描述】:

我遇到了一个问题。我知道 dp 可以在这里应用,但没有得到它。

考虑从0 开始到10^9 结束的正数行的一部分。你从0开始,可以执行N个任务。

ith 任务位于l[i],需要t[i] 时间才能执行。要执行ith 任务,您必须到达l[i] 点并在该位置花费时间t[i]

在路径上移动一个单位需要一秒钟,即从 1 到 3 需要 (3 - 1) = 2 秒。

你有 T 秒的时间,在这段时间内你必须执行尽可能多的任务并返回到起始位置。 我需要找到可以在时间 T 中执行的最大值。

示例

考虑 M = 3、T = 10、l[] = [1, 2] 和 t[] = [3, 2]。

如果我们执行第一个任务,总耗时是 1(旅行)+ 3(做任务)= 4。剩余时间是 10 - 4 = 6。

现在如果我们连续执行第二个任务,总时间为 1(从 1 出发)+ 2(完成任务)= 3。剩余时间为 6 - 3 = 3。

现在如果我们从 2 回到 0。总时间是 2。剩余时间是 3 - 2 = 1。 因此,我们可以在给定的时间内安全地完成这两项任务。所以答案是 2。

约束很高:

1 <= N <= 10 ^ 5
0 <= T <= 10 ^ 8
0 <= l[i], t[i] <= 10 ^ 9

【问题讨论】:

    标签: java arrays algorithm data-structures dynamic-programming


    【解决方案1】:

    有一个最优解,我们从 0 到某个坐标 x 并返回,贪婪地选择区间 [0, x] 从最短到最长的任务。

    可能有一个动态编程解决方案,但这不是我首先要达到的。相反,我会使用扫描线算法将 x 从 0 增加到 T/2,从而保持最佳解决方案。当 x 通过 l[i] 时,我们将任务 i 添加到议程中。每当当前议程占用太多时间时,我们就会放弃最长的任务。

    算法在 Python 中看起来像这样(未经测试)。

    import heapq
    
    
    def max_tasks(T, l, t):
        x = 0
        heap = []
        opt = 0
        # Sweep the tasks left to right
        for l_i, t_i in sorted(zip(l, t)):
            # Increase x to l_i
            T -= 2 * (l_i - x)
            x = l_i
            # Add task i to the agenda
            T -= t_i
            # This is a min-heap, but we want the longest tasks first
            heapq.heappush(heap, -t_i)
            # Address a time deficit by dropping tasks
            while T < 0:
                if not heap:
                    # Travelled so far we can't do any tasks
                    return opt
                # Subtract because the heap elements are minus the task lengths
                T -= heapq.heappop(heap)
            # Update the optimal solution so far
            opt = max(opt, len(heap))
        return opt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 2017-01-06
      相关资源
      最近更新 更多