Considere três sets A
, B
e C
cada uma contendo n
inteiros. A partir disso, podemos fazer o conjunto
S_n = {a * b + c | a in A, b in B, c in C}.
Dado um n
, há um ou mais tamanhos mínimos S_n
que dependem de quais conjuntos A,B and C
foram escolhidos.
Os conjuntos podem conter n
números inteiros distintos (positivo, zero ou negativo). Não é necessário que eles sejam números inteiros consecutivos ou que os conjuntos sejam iguais entre si, por exemplo. A = {-1, 0, 5, 10, 27}, B = {2, 5, 6, 10, 14} and C = {-23, 2, 100, 1000,10000}
é aceitável (embora não seja uma boa ideia), por exemplo.
Tarefa
A tarefa é escrever o código para encontrar o menor conjunto S_n
possível para cada um n
de 1
até 20
.
Para cada n
a partir 1
de 20
seu código deve emitir o escolhido A
, B
e C
junto com o tamanho resultante deS_n
Ponto
Sua pontuação será a soma dos tamanhos S_n
criados por você. Ou seja, será uma soma de vinte números.
Quanto menor a pontuação, melhor.
Exemplos
Se A = B = C = {1, 2, 3, 4}
então, S_4 = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
qual é o tamanho 19
.
No entanto, isso não é de forma ideal. Por exemplo, A = B = C = {-1, 0, 1, 2}
dá S_4 = {0, 1, 2, 3, 4, 5, 6, -1, -3, -2}
qual é do tamanho 10
.
Horários
Como precisarei executar o seu código para verificar a saída, verifique se não leva mais de 30 minutos e 4 GB de RAM para executar em uma área de trabalho normal.
Notas
Seu código deve realmente calcular a saída. Você não tem permissão para codificar respostas pré-computadas em seu código.
fonte
Respostas:
Rust, pontuação
14121411src/main.rs
Cargo.toml
Compile e execute com
cargo run --release
.Resultado
No meu laptop, isso usava cerca de 8 minutos e cerca de 1,5 GiB de memória.
Como funciona
Assumimos (sem qualquer justificação particular) que A e B são a gama óbvia de inteiros consecutivos centrado a 0 ou ½, em seguida, fazer um * Uma busca para uma óptima C dado Um e B .
fonte
B
eC
pode fazer a mesma pesquisa A *A
? Estou pensando em uma espécie de abordagem de descida coordenada. Corrija todos os conjuntos, exceto um, otimize o último e repita.A = B
e ambos os números inteiros consecutivos, são sempre sempre ótimos. Apenas um exemplo contrário seria emocionante.Axioma, pontuação 1466
Os conjuntos seriam A = B = [- n / 2..n / 2] se n% 2 == 0 else A = B = [- n / 2 .. ((n / 2) +1)]
O conjunto C é a soma do array como [-2, -1, .. (n-2)] para um array arr [] desse tipo [0,0,0,0,0] ou [0,1 , 1,1,2] ou [0,0,0,0,3] para que o array possua propriedade
Se você quiser ser mais preciso ou se o seu PC for mais rápido, tente aumentar '3' em 'inc (aix, 3)' que aumentam o número de matrizes para a variação do conjunto C e aumentam a precisão do resultado.
Nos resultados, a sequência impressa é
onde B = A e | S | é o número do elemento de S
fonte
SQL Server, 1495
A solução pode ser verificada aqui .
Com licença, a saída está no formato tabular.
fonte
C, pontuação
14481431Seria o mesmo +/- algo da implementação do Axiom
resultados
fonte
Python 2 , pontuação 1495
Experimente online!
Uma linha de base simples para que cada conjunto seja um intervalo de comprimento-n centrado em torno de 0, levemente desequilibrado até para n. O TIO possui código Python para calcular sua pontuação.
O tamanho é
(n*n+1)/2
para n ímpar e(n*n+n)/2
para n par.fonte
Mathematica, pontuação 1495
fonte
C ++, pontuação 1411
A conjetura A e B são números inteiros consecutivos centralizados próximos de 0, basta usar o recozimento simulado para encontrar C.
Fonte:
Resultados:
Com -O2 no meu computador, são necessários 50 segundos para calcular todos os resultados.
fonte