骗子之谜

时间:2012-06-07 11:31:11

标签: algorithm

我一直在努力解决Interviewstreet中的谜题。但是我现在还没有找到问题的线索。如果有人能给我一个暗示,那就太好了。

谜题是: 你有N个士兵从1到N.你的每个士兵都是骗子或真实的人。您有M组有关它们的信息。信息格式如下:

每一行包含3个整数 - A,B和C.这意味着在编号为{A,A + 1,A + 2,...,B}的士兵中,其中C恰好是骗子。 有如上所述的M行。

设L是你的骗子士兵的总数。由于您无法找到L的确切值,因此您需要找到L的最小值和最大值。

输入:

输入的第一行包含两个整数N和M. 接下来的M行中的每一行包含三个整数-A,B和C(1 <= Ai <= Bi <= n)和(0 <= Ci <= Bi-Ai)。其中Ai,B i和C i分别表示第i行中A,B和C的值 N和M不超过101,并且保证给定的信息是可满足的。您总能找到满足给定信息的情况。

输出:

将两个整数Lmin和Lmax打印到输出。

示例输入

3 2
1 2 1
2 3 1

示例输出

1 2

示例输入

20 11
3 8 4
1 9 6
1 13 9
5 11 5
4 19 12
8 13 5
4 8 4
7 9 2
10 13 3
7 16 7
14 19 4

示例输出

13 14

解释

在第一个示例测试用例中,第一行是&#34; 3 2&#34;,这意味着有3名士兵,我们有两组信息。第一个信息是在一组士兵{1,2}中,一个是骗子,第二个信息是在士兵组{2,3}中再次有一个骗子。现在这种情况有两种可能性:1号和3号士兵是骗子,2号士兵是骗子。 所以骗子的最小数量是1,最大骗子数是2.因此答案,1 2。

4 个答案:

答案 0 :(得分:7)

这是另一个动态编程问题。不需要启发式。

i0的每个n,您需要跟踪所有当前开放条件的距离,以跟踪最小和最大骗子数量。 (一个开放的条件是形式,“从这里到j我需要k更多的骗子。”)

如果您拥有i的解决方案,那么对于您拥有的每个部分解决方案,请转到i+1,如下所示:

  1. 删除您已达到且满意的所有条件。
  2. 为此号码添加所有新条件。如果新条件与现有解决方案冲突,请抛弃此部分解决方案。以下是j您需要k liars和j'您需要k'骗子与j <= j'的条件之间的冲突规则:
    1. 如果k < k'存在冲突。 (你不能在j之后拥有更多的骗子,而在j'之后再少一次。
    2. 如果j' - j < k' - k存在冲突。 (你不能在k' - k士兵中添加j' - j骗子。)
    3. 否则就没有冲突。
  3. 如果没有条件说士兵j您需要添加j-i说谎者,您可以为当前步骤添加部分解决方案,当前士兵不是骗子。 (在这里“添加”我的意思是“确保跟踪此状态,并根据需要更新最大/最小值,如果没有跟踪”。)
  4. 如果没有条件在未来的某个点上显示0个额外士兵,则可以为当前步骤添加部分解决方案,当前士兵是骗子。 (在这个解决方案中首先改变状态,说每个条件都需要少一个骗子 - 因为你添加了一个,然后像以前一样继续。)
  5. 您的起始条件是i = 01解决方案0骗子,绝对没有条件。

    0的解决方案开始为12,...,n生成部分解决方案。当你到达n时,你就得到了答案。

    (注意,通过适度修改,您不仅可以确定最大值和最小值,还可以确定有多少解决方案。)

答案 1 :(得分:5)

使用这些原则可以获得90%的使用方式:

  1. 如果集合中的骗子数等于零,则将该集合分解为大小为1的集合,每个集合的谎言数量等于零。 因此1 3 0变为1 1 02 2 0以及3 3 0

  2. 如果集合中的骗子数量等于集合的大小,则将该集合分解为大小为1的集合,每个集合的谎言数量等于1。 因此2 5 4变为2 2 13 3 1以及4 4 15 5 1

  3. 对于我们拥有的任何两个集合A和B,如果A是B的子集,则从B中删除所有A的元素,并从B中的说谎者数量中减去A中的说谎者数量。

  4. 我们将使用这些原则来解决您的两个样本问题中的较长时间。 首先获取给定的输入,然后将它们转换为索引集。

        3 4 5 6 7 8                                         [4]
    1 2 3 4 5 6 7 8 9                                       [6]
    1 2 3 4 5 6 7 8 9 10 11 12 13                           [9]
            5 6 7 8 9 10 11                                 [5]
          4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19         [12]
                  8 9 10 11 12 13                           [5]
          4 5 6 7 8                                         [4]
                7 8 9                                       [2]
                      10 11 12 13                           [3]
                7 8 9 10 11 12 13 14 15 16                  [7]
                                  14 15 16 17 18 19         [4]
    

    4 5 6 7 83 4 5 6 7 8的子集,因此从另一个中减去一个。

        3                                                   [1]
    1 2 3 4 5 6 7 8 9                                       [6]
    1 2 3 4 5 6 7 8 9 10 11 12 13                           [9]
            5 6 7 8 9 10 11                                 [5]
          4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19         [12]
                  8 9 10 11 12 13                           [5]
          4 5 6 7 8                                         [4]
                7 8 9                                       [2]
                      10 11 12 13                           [3]
                7 8 9 10 11 12 13 14 15 16                  [7]
                                  14 15 16 17 18 19         [4]
    

    7 8 910 11 12 1314 15 16 17 18 19都是4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19的子集,因此请减去它们。

        3                                                   [1]
    1 2 3 4 5 6 7 8 9                                       [6]
    1 2 3 4 5 6 7 8 9 10 11 12 13                           [9]
            5 6 7 8 9 10 11                                 [5]
          4 5 6                                             [3]
                  8 9 10 11 12 13                           [5]
          4 5 6 7 8                                         [4]
                7 8 9                                       [2]
                      10 11 12 13                           [3]
                7 8 9 10 11 12 13 14 15 16                  [7]
                                  14 15 16 17 18 19         [4]
    

    4 5 6有三个骗子,所以将它们分解为单独的集合。

        3                                                   [1]
          4                                                 [1]
            5                                               [1]
              6                                             [1]
    1 2 3 4 5 6 7 8 9                                       [6]
    1 2 3 4 5 6 7 8 9 10 11 12 13                           [9]
            5 6 7 8 9 10 11                                 [5]
                  8 9 10 11 12 13                           [5]
          4 5 6 7 8                                         [4]
                7 8 9                                       [2]
                      10 11 12 13                           [3]
                7 8 9 10 11 12 13 14 15 16                  [7]
                                  14 15 16 17 18 19         [4]
    

    从包含它们的所有集合中减去3,4,5和6。

        3                                                   [1]
          4                                                 [1]
            5                                               [1]
              6                                             [1]
    1 2         7 8 9                                       [2]
    1 2         7 8 9 10 11 12 13                           [5]
                7 8 9 10 11                                 [3]
                  8 9 10 11 12 13                           [5]
                7 8                                         [1]
                7 8 9                                       [2]
                      10 11 12 13                           [3]
                7 8 9 10 11 12 13 14 15 16                  [7]
                                  14 15 16 17 18 19         [4]
    

    7 8

    中减去7 8 9
        3                                                   [1]
          4                                                 [1]
            5                                               [1]
              6                                             [1]
                    9                                       [1]
    1 2         7 8 9                                       [2]
    1 2         7 8 9 10 11 12 13                           [5]
                7 8 9 10 11                                 [3]
                  8 9 10 11 12 13                           [5]
                7 8                                         [1]
                      10 11 12 13                           [3]
                7 8 9 10 11 12 13 14 15 16                  [7]
                                  14 15 16 17 18 19         [4]
    

    从包含它的所有集合中减去9。

        3                                                   [1]
          4                                                 [1]
            5                                               [1]
              6                                             [1]
                    9                                       [1]
    1 2         7 8                                         [1]
    1 2         7 8   10 11 12 13                           [4]
                7 8   10 11                                 [2]
                  8   10 11 12 13                           [4]
                7 8                                         [1]
                      10 11 12 13                           [3]
                7 8   10 11 12 13 14 15 16                  [6]
                                  14 15 16 17 18 19         [4]
    

    从包含两者的任何集合中减去7 8

        3                                                   [1]
          4                                                 [1]
            5                                               [1]
              6                                             [1]
                    9                                       [1]
    1 2                                                     [0]
    1 2               10 11 12 13                           [3]
                      10 11                                 [1]
                  8   10 11 12 13                           [4]
                7 8                                         [1]
                      10 11 12 13                           [3]
                      10 11 12 13 14 15 16                  [5]
                                  14 15 16 17 18 19         [4]
    

    1 2有0个liars,因此将它们分解为单独的集合。

    1                                                       [0]
      2                                                     [0]
        3                                                   [1]
          4                                                 [1]
            5                                               [1]
              6                                             [1]
                    9                                       [1]
    1 2               10 11 12 13                           [3]
                      10 11                                 [1]
                  8   10 11 12 13                           [4]
                7 8                                         [1]
                      10 11 12 13                           [3]
                      10 11 12 13 14 15 16                  [5]
                                  14 15 16 17 18 19         [4]
    

    从包含它们的所有其他集合中减去1和。

    1                                                       [0]
      2                                                     [0]
        3                                                   [1]
          4                                                 [1]
            5                                               [1]
              6                                             [1]
                    9                                       [1]
                      10 11                                 [1]
                  8   10 11 12 13                           [4]
                7 8                                         [1]
                      10 11 12 13                           [3]
                      10 11 12 13 14 15 16                  [5]
                                  14 15 16 17 18 19         [4]
    

    从包含两者的任何集合中减去10 11

    1                                                       [0]
      2                                                     [0]
        3                                                   [1]
          4                                                 [1]
            5                                               [1]
              6                                             [1]
                    9                                       [1]
                      10 11                                 [1]
                  8         12 13                           [3]
                7 8                                         [1]
                            12 13                           [2]
                            12 13 14 15 16                  [4]
                                  14 15 16 17 18 19         [4]
    

    8 12 13有三个骗子,所以将它们分解为单独的集合,并从包含它们的任何其他集合中减去它们。

    1                                                       [0]
      2                                                     [0]
        3                                                   [1]
          4                                                 [1]
            5                                               [1]
              6                                             [1]
                7                                           [0]
                  8                                         [1]
                    9                                       [1]
                      10 11                                 [1]
                            12                              [1]
                               13                           [1]
                                  14 15 16                  [2]
                                  14 15 16 17 18 19         [4]
    

    14 15 16减去14 15 16 17 18 19

    1                                                       [0]
      2                                                     [0]
        3                                                   [1]
          4                                                 [1]
            5                                               [1]
              6                                             [1]
                7                                           [0]
                  8                                         [1]
                    9                                       [1]
                      10 11                                 [1]
                            12                              [1]
                               13                           [1]
                                  14 15 16                  [2]
                                           17 18 19         [2]
    

    我们的结果集彼此不相交。如果我们将它们结合在一起,就像这样:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19         [13]
    

    我们可以看到从1到19的骗子数是13。

    这种技术并不能完全解决所有情况下的问题。例如,在两个样本输入中较短的一个中,这种技术确实没什么用。但是,对于较大的问题,它会将您的集合分解为更多的模块化形式,我希望这会使得粗暴强制变得更容易/更快。例如,在较大的样本中,我们将问题空间分解为两种可能性:

    1. there are 13 liars among soldiers 1-19, and Soldier 20 is not a liar.
    2. there are 13 liars among soldiers 1-19, Soldier 20 is a liar.
    

    我们可以很容易地评估这两种情况,以确定最小骗子数是13,最大值是14.这比尝试所有2 ^ 20个骗子和非传染者组合要快得多。

答案 2 :(得分:3)

您可以轻松地将其表示为整数线性程序。由于约束矩阵是完全单模的,因此可以通过任何ILP求解器快速求解。

答案 3 :(得分:0)

好的,如何将问题重新转化为概率/分布估算

这非常类似于&#34;逆问题&#34; (例如从已知平均值推断概率分布)MAXENT(最大熵)等方法解决得非常好(例如http://books.google.gr/books?id=Kk6SyQ0AmjsC&pg=PA35&lpg=PA35&dq=MAXENT+inference&source=bl&ots=W4kVjXRpe7&sig=IzjnOVT0FQJtIXSkeFssNxolLh4&hl=el&sa=X&ei=nxJkU-LUHMmkPciigZAH&ved=0CGcQ6AEwCDgK#v=onepage&q=MAXENT%20inference&f=false

(另外很高兴能够将看似奇怪的领域连接到不足的物理现实中)

鸟类?? :)