Considere todas as 2^n
diferentes cadeias binárias de comprimento n
e assuma n > 2
. Você tem permissão para excluir exatamente os b < n/2
bits de cada uma das cadeias binárias, deixando as cadeias de comprimento n-b
restantes. O número de strings distintas restantes depende de quais bits você exclui. Supondo que seu objetivo seja deixar o menor número possível de strings diferentes restantes, esse desafio é escrever um código para calcular o quão poucos você pode deixar em função de n
.
Exemplo n=3
e b = 1
. Você pode deixar apenas as duas strings 11
e 00
.
Para n=9
e b = 1,2,3,4
temos70,18,6,2
Para n=8
e b = 1,2,3
temos40,10,4
Para n=7
e b = 1,2,3
temos20,6,2
Para n=6
e b = 1,2
temos12,4
Para n=5
e b = 1,2
temos6,2
Esta pergunta foi originalmente feita por mim em 2014 de uma forma diferente no MO .
Entrada e saída
Seu código deve incluir um número inteiro n
e gerar um único número inteiro para cada valor de b
início b = 0
e aumento.
Ponto
Sua pontuação é a maior n
para a qual seu código é concluído b < n/2
em menos de um minuto no meu PC com Linux. Em caso de desempate, o maior que o b
seu código atingir para as maiores n
vitórias conjuntas . No caso de quebra de empate também nesse critério, o código mais rápido para os maiores valores de n
e b
decide. Se o tempo estiver dentro de um ou dois segundos um do outro, a primeira resposta publicada vence.
Línguas e bibliotecas
Você pode usar qualquer idioma da biblioteca que desejar. Como eu tenho que executar o seu código, ajudaria se fosse gratuito (como na cerveja) e funcionasse no Linux.
fonte
b > 0
como requisito de entrada adicional? Ou serian=3
eb=0
simplesmente produziria2^n
como resultado?2^n
mesmo.n
e únicab
, mas a pontuação é a maiorn
pela qual o código é concluídob < n/2
em menos de um minuto. Não seria melhor ter uma única entradan
nesse caso e gerar todos os resultados0 <= b < n/2
? Ou devemos fornecer dois programas / funções: um recebendo duas entradasn
eb
, e outro recebendo apenas entradasn
e saídas de todos os resultados no intervalo0 <= b < n/2
?Respostas:
Python 2.7 / Gurobi n = 9
Essa solução é um uso muito direto do solucionador ILP de Gurobi para os problemas de número inteiro misto (MIP) booleanos.
O único truque é eliminar a simetria no complemento de 1 para reduzir pela metade os tamanhos dos problemas.
Usando a licença "gratuita" por tempo limitado da Gurobi LLC, estamos restritos a 2000 restrições, mas a solução 10 del 1 está bem fora do prazo de 60 segundos no meu laptop.
UPDATE + CORR: 10,2 possui o tamanho ideal da solução 31 (veja por exemplo) Gurobi não mostra nenhuma solução simétrica do tamanho 30 (retorna um problema inviável) .. [minha tentativa de mostrar viabilidade assimétrica em 30 permaneceu inconclusiva após 9,5 horas de execução], por exemplo, bit padrões de números inteiros
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
ou0 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
fonte
C ++, n = 6
Força bruta com algumas pequenas otimizações.
Executar localmente:
fonte