これらの原則を使用して、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
任意の 2 つのセット A と B について、A が B の部分集合である場合、B から A のすべての要素を削除し、B の嘘つきの数から A の嘘つきの数を引きます。
これらの原則を使用して、2 つのサンプル問題の長い方を解決します。与えられた入力を取得し、それらを一連のインデックスに変換することから始めます。
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 人いるので、それらを個別のセットに分解します。
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 人なので、それらを個々のセットに分解します。
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 と 2 を減算します。
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
には 3 つの嘘つきがいるので、それらを個別のセットに分解し、それらを含む他のセットからそれらを差し引きます。
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 であることがわかります。
この手法は、すべての場合に問題を完全に解決するわけではありません。たとえば、2 つのサンプル入力の短い方では、この手法は文字通り何もしません。ただし、より大きな問題の場合、セットをよりモジュール化された形式に分解します。これにより、総当たり攻撃がより簡単/高速になると思います。たとえば、より大きなサンプルでは、問題空間を正確に 2 つの可能性に分解しました。
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.
これら 2 つのケースを簡単に評価して、嘘つきの数の最小値が 13、最大値が 14 であることを判断できます。