Set-Covering Prob的变化(可能是一个活动选择问题)

时间:2014-12-26 09:31:31

标签: algorithm time-complexity

每天上午9点到下午5点,我应该至少有一个人在工厂监督工人并确保没有任何问题。

目前有 n 申请人,他们每个人都可以在 si 的时间工作到时间 ci i = 1,2,..., n

我的目标是尽量减少超过两个人同时监视工人的时间。

(申请人的可用工作时间可以涵盖上午9点至下午5点的时间段。)

我已经证明,在任何时刻都需要最多两个人来满足我的需求,但是我应该如何从这里获得最终的解决方案呢?

找到只有一个人可以从事这项工作并保留这些工作的时间段是我的第一步,但找到下一步就是困扰我......

算法必须以多项式时间运行。

欢迎任何提示(特定类型的数据结构?)或参考。非常感谢。

1 个答案:

答案 0 :(得分:0)

我认为你可以通过解决子问题来实现动态编程:

  

申请人i是最后一名工人的最短重叠时间是多少,我们从一天开始到ci都涵盖了所有时间?

调用此最小重叠时间成本(i)的值。

您可以通过考虑案例来计算成本(i)的值:

  1. 如果si等于一天的开始,那么cost(i)= 0(不需要重叠)
  2. 否则,请考虑所有以前的申请人j。将成本(i)设置为成本(j)的最小值+ i和j之间的重叠。同时将prev(i)设置为达到最小值的j的值。
  3. 然后,你的问题的答案由k的所有值的最小成本(k)给出,其中ck等于一天的结束。您可以使用prev的值进行回溯,找出正确的人选。

    这给出了O(n ^ 2)算法。