Рассмотрим все 2^n
разные двоичные строки длины n
и предположим n > 2
. Вам разрешено удалять ровно b < n/2
биты из каждой двоичной строки, оставляя строки с n-b
оставшейся длиной . Количество оставшихся отдельных строк зависит от того, какие биты вы удаляете. Предполагая, что ваша цель состоит в том, чтобы оставить как можно меньше оставшихся различных строк, эта задача состоит в том, чтобы написать код, чтобы вычислить, как мало вы можете оставить как функцию n
.
Пример n=3
и b = 1
. Вы можете оставить только две строки 11
и 00
.
Ибо n=9
и b = 1,2,3,4
у нас есть70,18,6,2
Ибо n=8
и b = 1,2,3
у нас есть40,10,4
Ибо n=7
и b = 1,2,3
у нас есть20,6,2
Ибо n=6
и b = 1,2
у нас есть12,4
Ибо n=5
и b = 1,2
у нас есть6,2
Этот вопрос был изначально задан мной в 2014 году в другой форме на МО .
Вход и выход
Ваш код должен принимать целое число n
и выводить одно целое число для каждого значения, b
начиная с b = 0
и увеличивая.
Гол
Ваш результат является самым большим, n
за который ваш код завершается за все b < n/2
меньше чем за минуту на моем ПК на базе Linux. В случае разрыва связи, самый большой b
ваш код получает для совместных самых больших n
побед. В случае разрыва связи по этому критерию, самый быстрый код для самых больших значений n
и b
решает. Если время находится в пределах секунды или двух друг от друга, выигрывает первый опубликованный ответ.
Языки и библиотеки
Вы можете использовать любой язык библиотеки, который вам нравится. Поскольку я должен запустить ваш код, было бы полезно, если бы он был бесплатным (как в пиве) и работал в Linux.
источник
b > 0
качестве дополнительного ввода-требования? Или быn=3
иb=0
просто выход в2^n
качестве результата?2^n
действительно выводить .n
и одиночныйb
, но счет является наибольшим,n
для которого код завершает всеb < n/2
в течение минуты. Разве не было бы лучше иметь один входn
в этом случае и выводить все результаты для0 <= b < n/2
? Или мы должны обеспечить две программы / функции: один принимает два входаn
иb
, и один принимает только вводn
и вывод всех результатов в диапазоне0 <= b < n/2
?Ответы:
Python 2.7 / Gurobi n = 9
Это решение - очень прямое использование решения Gurobi ILP для булевых задач со смешанными целыми числами (MIP).
Единственная хитрость заключается в том, чтобы убрать симметрию в дополнении 1, чтобы уменьшить размеры задачи вдвое.
Используя ограниченную по времени «бесплатную» лицензию Gurobi LLC, мы ограничены 2000 ограничениями, но решение 10 дел 1 в любом случае выходит за рамки 60-секундного ограничения на моем ноутбуке.
UPDATE + CORR: 10,2 имеет оптимальный размер решения 31 (см., Например, Гуроби показывает, что симметричное решение размера 30 не существует (возвращает проблему неосуществимой) .. [моя попытка показать асимметричную выполнимость при 30 осталась неубедительной после 9,5 часов работы], например шаблоны целых чисел
0 7 13 14 25 28 35 36 49 56 63 64 95 106 118 128 147 159 170 182 195 196 200 207 225 231 240 243 249 252 255
или0 7 13 14 19 25 28 35 36 49 56 63 64 95 106 118 128 159 170 182 195 196 200 207 225 231 240 243 249 252 255
источник
C ++, n = 6
Грубая сила с некоторыми небольшими оптимизациями.
Запустите локально:
источник