Вы можете пройти 90% пути, используя следующие принципы:
Если количество лжецов в наборе равно нулю, разбейте этот набор на наборы размера 1, в каждом из которых количество лжецов равно нулю. Итак, 1 3 0
становится 1 1 0
, 2 2 0
и 3 3 0
.
Если количество лжецов в наборе равно размеру набора, разложите этот набор на наборы размера 1, в каждом из которых количество лжецов равно одному. Таким образом, 2 5 4
становится 2 2 1
, 3 3 1
, 4 4 1
и 5 5 1
.
Для любых двух имеющихся у нас множеств A и B, если A является подмножеством B, тогда удалите все элементы A из B и вычтите количество лжецов в A из числа лжецов в B.
Мы будем использовать эти принципы для решения более длинной из ваших двух примеров задач. Начните с ввода данных и преобразования их в наборы индексов.
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 лжецов, поэтому разложите их по отдельным множествам.
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
есть три лжеца, поэтому разложите их на отдельные наборы и вычтите их из любых других наборов, которые их содержат.
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 комбинаций лжецов и не лжецов.
person
Kevin
schedule
07.06.2012