【问题标题】:Can one turn all the light bulbs with m switches or not能不能用m个开关把所有的灯泡都转一下
【发布时间】:2018-12-01 04:41:23
【问题描述】:

给定n 灯泡,最初,所有灯泡都关闭,m 开关,每个开关控制一系列灯泡lr(包括两者)

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

如果可以,答案可以是肯定的,如果不能,答案可以是否定的。

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

5 2
1 2
3 5

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

第二个例子

5 2
1 2
3 4

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

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

但只有示例测试用例通过,其余全部失败。

注意:范围可能相交

如果范围相交,例如

1 3 
3 5

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

所以答案是否定的。

【问题讨论】:

  • 范围可以相交吗?另外,请编辑标题和帖子(没有“u”字样、大写字母等)?
  • 我猜范围可以重叠。例如1 33 5。在这种情况下,如果两个开关都打开会发生什么?
  • 没有提到范围是否可以重叠,但我想它们会相交,这就是让问题变得困难的原因,否则它只会通过简单的计数来运行。
  • 我同意。因此,如果第一行是5 2,然后是1 33 5,答案是YES 还是NO?
  • @dyukha 如果您认为问题的表述需要改进,您可以建议edit

标签: java arrays algorithm


【解决方案1】:

我们可以将此问题视为XOR-SAT 问题的一个实例,尽管它比这里提出的问题更普遍,但这是一种方法。

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

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

等价于有如下公式,我们要满足:

(x1^x2^x3)&(x1^x 2)&(x1^x3).

现在我们要满足这个公式。我们首先将其写为模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

二、反替换:x1 = 0, x2 = 0, x3 = 1,这显然是答案.

所以,这里主要的复杂性是编程高斯消元过程。

【讨论】:

  • 很好的描述(我有一个类似的解决方案,但没有注意到与线性系统的关系)。还可以注意到,由于我们的开关覆盖了段(不是随机子集),您可以将时间从 O(n^3) 减少到 O(n^2)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 2012-10-12
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
相关资源
最近更新 更多