Considere todas las 2^n
diferentes cadenas binarias de longitud n
y asuma n > 2
. Se le permite eliminar exactamente b < n/2
bits de cada una de las cadenas binarias, dejando cadenas de longitud n-b
restante. El número de cadenas distintas restantes depende de los bits que elimine. Asumiendo que su objetivo es dejar el menor número posible de cadenas diferentes, este desafío es escribir código para calcular qué tan pocos puede dejar en función de n
.
Ejemplo n=3
y b = 1
. Puede dejar solo las dos cadenas 11
y 00
.
Para n=9
y b = 1,2,3,4
tenemos70,18,6,2
Para n=8
y b = 1,2,3
tenemos40,10,4
Para n=7
y b = 1,2,3
tenemos20,6,2
Para n=6
y b = 1,2
tenemos12,4
Para n=5
y b = 1,2
tenemos6,2
Esta pregunta fue originalmente planteada por mí en 2014 en una forma diferente en MO .
Entrada y salida
Su código debe incluir un entero n
y generar un solo entero para cada valor de b
comenzar b = 0
y aumentar.
Puntuación
Su puntaje es el más grande n
para el cual su código se completa para todos b < n/2
en menos de un minuto en mi PC con Linux. En caso de desempate, cuanto mayor sea b
su código para las mayores n
ganancias conjuntas . En caso de desempate también en ese criterio, el código más rápido para los valores más grandes de n
y b
decide. Si los tiempos están dentro de un segundo o dos entre sí, la primera respuesta publicada gana.
Idiomas y bibliotecas
Puede usar cualquier idioma de la biblioteca que desee. Debido a que tengo que ejecutar su código, ayudaría si fuera gratis (como en cerveza) y funcionara en Linux.
fuente
b > 0
como requisito de entrada adicional? ¿O simplementen=3
y como resultado?b=0
2^n
2^n
hecho.n
y únicab
, pero la puntuación es la más granden
para la cual el código completa todob < n/2
en menos de un minuto. ¿No sería mejor tener una sola entradan
en ese caso y generar todos los resultados0 <= b < n/2
? O debemos proporcionar dos programas / funciones: uno teniendo dos entradasn
yb
, y uno tomando solamente la entradan
y la salida de todos los resultados en el rango0 <= b < n/2
?Respuestas:
Python 2.7 / Gurobi n = 9
Esta solución es un uso muy directo del solucionador ILP de Gurobi para los problemas booleanos de enteros mixtos (MIP).
El único truco es eliminar la simetría en el complemento de 1 para reducir a la mitad los tamaños del problema.
Al usar la licencia "gratuita" de tiempo limitado de Gurobi LLC, estamos restringidos a 2000 restricciones, pero resolver 10 del 1 está muy por encima del límite de tiempo de 60 segundos de todos modos en mi computadora portátil.
ACTUALIZACIÓN + CORR: 10,2 tiene un tamaño de solución óptimo 31 (ver, por ejemplo) Gurobi muestra que no existe una solución simétrica de tamaño 30 (el problema no es factible). patrones de enteros
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
o0 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
fuente
C ++, n = 6
Fuerza bruta con algunas pequeñas optimizaciones.
Ejecutar localmente:
fuente