我一直在努力解决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。
答案 0 :(得分:7)
这是另一个动态编程问题。不需要启发式。
从i
到0
的每个n
,您需要跟踪所有当前开放条件的距离,以跟踪最小和最大骗子数量。 (一个开放的条件是形式,“从这里到j
我需要k
更多的骗子。”)
如果您拥有i
的解决方案,那么对于您拥有的每个部分解决方案,请转到i+1
,如下所示:
j
您需要k
liars和j'
您需要k'
骗子与j <= j'
的条件之间的冲突规则:
k < k'
存在冲突。 (你不能在j
之后拥有更多的骗子,而在j'
之后再少一次。j' - j < k' - k
存在冲突。 (你不能在k' - k
士兵中添加j' - j
骗子。)j
您需要添加j-i
说谎者,您可以为当前步骤添加部分解决方案,当前士兵不是骗子。 (在这里“添加”我的意思是“确保跟踪此状态,并根据需要更新最大/最小值,如果没有跟踪”。)0
个额外士兵,则可以为当前步骤添加部分解决方案,当前士兵是骗子。 (在这个解决方案中首先改变状态,说每个条件都需要少一个骗子 - 因为你添加了一个,然后像以前一样继续。)您的起始条件是i = 0
,1
解决方案0
骗子,绝对没有条件。
从0
的解决方案开始为1
,2
,...,n
生成部分解决方案。当你到达n
时,你就得到了答案。
(注意,通过适度修改,您不仅可以确定最大值和最小值,还可以确定有多少解决方案。)
答案 1 :(得分:5)
使用这些原则可以获得90%的使用方式:
如果集合中的骗子数等于零,则将该集合分解为大小为1的集合,每个集合的谎言数量等于零。
因此1 3 0
变为1 1 0
和2 2 0
以及3 3 0
。
如果集合中的骗子数量等于集合的大小,则将该集合分解为大小为1的集合,每个集合的谎言数量等于1。
因此2 5 4
变为2 2 1
和3 3 1
以及4 4 1
和5 5 1
。
对于我们拥有的任何两个集合A和B,如果A是B的子集,则从B中删除所有A的元素,并从B中的说谎者数量中减去A中的说谎者数量。
我们将使用这些原则来解决您的两个样本问题中的较长时间。 首先获取给定的输入,然后将它们转换为索引集。
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 8
是3 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 9
,10 11 12 13
和14 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)
(另外很高兴能够将看似奇怪的领域连接到不足的物理现实中)
鸟类?? :)