在给定的N辆车序列中找出可能的紫色车辆的最大数量。(见说明)

时间:2015-11-06 08:03:31

标签: algorithm optimization data-structures

连续N辆车的编号从1到N. 一个人拍摄汽车的M照片。对于每张照片,出现在其中的汽车由元组(i,j)给出,这意味着从第i辆汽车到第j辆汽车的所有汽车都将出现在该照片中。

请注意,所有照片都不需要覆盖每辆车。汽车可以出现在多张照片中。

每张照片都包含正好1 的紫色汽车。找到可能的紫色车的最大数量。如果不可能打印-1。

输入:第一行包含N和M.下一行包含M对(x,y),它们代表包含从第x辆车到第0辆车的汽车的照片。 输出:可能的紫色车辆的最大数量。

示例:

输入

5 1

(3 5)

输出:3

说明:只有一辆3到5的车可以是紫色的。汽车1和汽车2将是紫色的,以最大化紫色汽车的数量。

输入

5 1

(4 4)

输出:5

输入

5 3

(1 4),(3 5),(3,4)

输出:1

说明:3或4可以是紫色车。

输入

5 2

(1,4),(2,5)

输出:2

说明:Car 1和Car 5可以是紫色。

输入

10 3

(1 5),(6,10),(1,10)

输出: - 1

说明:在这种情况下,每个区间都不可能只有一辆紫色车。

2 个答案:

答案 0 :(得分:1)

如果我没有弄错的话,问题可以解决为网络问题如下。

网络的节点集具有源节点s和终端t;想象最左边位置的水槽和最右边的终端,流程从左到右。在s旁边为每辆车放置一个节点,并将s连接到每辆车。汽车节点旁边为每个间隔创建一个节点。现在从汽车节点开始,创建t的路径,遍历间隔节点集;路径经过包含汽车的每个区间。

除了st之外,每个节点中的流量都被限制为1,每个区间的1汽车必须是紫色的;弧明确地不需要受到约束。最后通过一些网络流算法,最大化从st的流量强度。为每个车辆的紫色着色,其节点具有非零流量。如果实例不允许可行流,则初始问题实例是不可行的。

答案 1 :(得分:1)

请注意,如果有一张完全由另一张照片覆盖的照片,我们只需关心外部照片(无关紧要)。

第二次观察:

目前,在删除所有已覆盖的照片后(如上所述),我们将留下这样的案例:

我们有n张照片,可以分为几组,每组都是一组m张照片:(a1, b1) , (a2, b2) ... , (am, bm) a1 < a2 and b1 > a2 ... or ai < a(i + 1) and bi > a(i + 1)

我们注意到,如果我们为第一张照片选择第一辆紫色汽车在(a1, a2)范围内,并且继续以这种方式选择汽车(第一个尚未覆盖的范围),它总是最佳的任何车)。证明:

  • 如果我们选择(a1, a2)范围内的汽车,那么可以选择的下一辆车将在(b1 , bm)范围内,否则,如果我们选择其他车辆(范围(a2,b1)),选择下一辆车的范围将是更小的范围(平凡看到),因此,选择范围(a1, a2)中的车将获得最佳结果。

如果我们实施扫描线算法,时间复杂度将 O(m log m)

注意:此算法仅在照片集有效时有效,否则我们需要检查其有效性。

更新:正如PeterdeRivaz指出的那样,我们需要处理一个特例:当有两张或更多照片时,两张照片都覆盖了一张照片,因此,我们需要加入所有这些照片