能否用m个开关转动所有灯泡

时间:2018-12-01 04:41:24

标签: java arrays algorithm

在使用n灯泡的情况下,首先,所有灯泡都关闭并且m开关,每个开关控制灯泡lr(包括两端)的范围

我们需要确定是否可以随时使用m开关中的任何一个来打开所有灯泡。

如果可以,答案可以为是,如果不能,答案为否。

例如,首先给定n,然后给定m,然后接下来的m行给出开关控制的范围。在下面的示例n = 5m = 2中。

5 2
1 2
3 5

这里的答案是肯定的,因为2个开关可以控制所有灯泡。并可以将其打开。

第二个例子

5 2
1 2
3 4

这里的答案是否定的,因为其中一个灯泡不受任何开关的控制。

我所做的是声明一个大小为m的数组计数,如果计数总和等于(r-l +1),那么我为每个开关计算由n控制的灯泡数量,然后是否则没有。

但是只有示例测试用例通过了,其余所有都失败了。

注意:范围可能相交

如果范围相交,例如

1 3 
3 5

答案是否定的,因为当转动第三只灯泡上的第二个开关时,它会从打开转到关闭

所以答案是否定的。

1 个答案:

答案 0 :(得分:1)

我们可以将此问题视为实例XOR-SAT问题,尽管它比此处提出的问题更为笼统,但这是一种解决方法。

为了获得一些直觉,我提供了一个非常简单的示例。假设您有三个开关和三个灯泡的系统,如下所示:

S    B
1    1, 3    // toggles bulbs 1 and 3
2    1, 2
3    1, 2, 3

具有以下我们想要满足的公式:

  

(x 1 ^ x 2 ^ x 3 )&(x 1 ^ x 2 )&(x 1 ^ x 3 )。

现在我们要满足这个公式。我们首先将其写为布尔模的模2的系统:

 |1 1 1|   |x_1|   |1|
 |0 1 1| * |x_2| = |1| mod 2
 |1 0 1|   |x_3|   |1|

现在用Gaussian elimination解决。

首先,将第一行和第二行添加到第三行:

1 1 1   1      1 1 1   1
0 1 1   1   -> 0 1 1   1
1 0 1   1      0 0 1   1   // for RHS, 1+1+1 = 1 mod 2

第二个后替换项:x 1 = 0,x 2 = 0,x 3 = 1,这显然是答案

所以,这里的主要复杂度是编写高斯消去过程。