以k次尝试满足最多来宾(时间间隔)

时间:2018-05-14 21:31:53

标签: algorithm dynamic-programming intervals

有派对正在进行,派对中每位客人的时间间隔。我可以进入派对室k次。现在我应该选择k个时间实例,这样我才能遇见最多的客人

n - 没有。客人 k - 不。尝试

例如:对于n = 5& k = 2

给出5位客人的间隔[1,3] [4,8] [1,5] [6,8] [4,8] 在时间= 1时我可以遇到第一和第一第三位客人&在时间= 6我可以遇见第二,第四和第二第5位客人。所以我最多可以在2次尝试中遇到5位客人。 我失败的方法:

  1. 使用间隔树查找最大重叠点,在该点删除的间隔&第二次做同样的事。它失败了,因为它只给出了最大客户点,就像我在这个例子中得到时间= 4。这是不错的选择,因为那时我只能遇到4位客人。 (3时间= 4& 1时间= 1或时间= 6) 所以我认为它是动态编程&现在我来了。 给出或建议我一个算法或解决方案。提前致谢

2 个答案:

答案 0 :(得分:0)

好吧,我建议去动态编程。您可以轻松地检查"最佳时间"进入宴会厅是指某人的时间到了。在你的例子中它将是3,5和8.那么你想要做的是计算从中获取2的最佳方案(我仍然在你的例子中解决它,因为我认为这将是最好的解释)。在这里你可以计算出你将3,然后是5,然后是8,并使用相同的递归计算它们。您可以保留设置的时间以避免重复,并且在完成k步骤后,只需检查其大小,最大的是解决方案。

答案 1 :(得分:0)

建立任何人进入的时间点列表(或任何人离开房间时的类似点,如@Ajris建议的那样)。这里的时间是1,4,6

构建图形(这是针对此时刻的二分图),左侧部分包含来宾,右侧部分包含时间点。每个客人在他们进入房间时都要到时间点。边缘是:

 g1: t1
 g2: t4, t6
 g3  t1, t4
 g4: t6
 g5: t4 ,t6

现在添加辅助顶点S'留给客人并为所有客人添加单位容量的边缘(图表不是更多的二分,只是指示)。再添加一个顶点S(源)到S'并使边缘S-S'容量K

同时将目标顶点T正确添加到时间并添加每个时间点的边(容量K)。

现在解决具有any available algorithm

的S-T源 - 汇对的最大整数流问题