fundo
A desigualdade de rearranjo é uma desigualdade baseada em números de reorganização. Se eu tiver duas listas de números do mesmo comprimento, x 0 , x 1 , x 2 ... x n-1 e y 0 , y 1 , y 2 ... y n-1 do mesmo comprimento, onde eu É permitido reorganizar os números na lista, uma maneira de maximizar a soma x 0 y 0 + x 1 y 1 + x 2 y 2 + ... + x n-1 y n-1 é classificar as 2 listas em ordem não decrescente.
Leia o artigo da Wikipedia aqui.
Tarefa
Você escreveria um programa que recebe a entrada do STDIN ou uma função que aceita 2 matrizes (ou contêineres relacionados) de números (que têm o mesmo comprimento).
Supondo que você escreva uma função que aceite 2 matrizes (aeb), você encontrará o número de maneiras pelas quais pode reorganizar os números na segunda matriz (b) para maximizar:
a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+...+a[n-1]*b[n-1]
Nesse caso, se a matriz b for [1 0 , 2 1 , 2 2 , 3 3 , 3 4 ] (índices de clareza),
[1 0 , 2 1 , 2 2 , 3 3 , 3 4 ],
[1 0 , 2 1 , 2 2 , 3 4 , 3 3 ], (troque os dois 3)
[1 0 , 2 2 , 2 1 , 3 3 , 3 4 ] (troque os dois 2)
[1 0 , 2 2 , 2 1 , 3 4 , 3 3 ] (troque os dois 3 e troque os dois 2)
são considerados arranjos diferentes. A matriz original, por si só, também conta como um possível rearranjo se também maximizar a soma.
Para entrada STDIN, você pode assumir que o comprimento das matrizes é fornecido antes das matrizes (indique para usá-las) ou que as matrizes sejam fornecidas em linhas diferentes (também indique).
Aqui estão as 4 entradas possíveis (por conveniência):
5 1 1 2 2 2 1 2 2 3 3 (length before arrays)
1 1 2 2 2 1 2 2 3 3 (the 2 arrays, concatenated)
1 1 2 2 2
1 2 2 3 3 (the 2 arrays on different lines)
5
1 1 2 2 2
1 2 2 3 3 (length before arrays and the 2 arrays on different lines)
Para saída, você pode retornar a resposta (se você escrever uma função) ou imprimir a resposta em STDOUT. Você pode escolher a saída mod 10 9 +7 (de 0 a 10 9 +6), se for mais conveniente.
Casos de teste (e explicação):
[1 1 2 2 2] [1 2 2 3 3] => 24
As 2 primeiras entradas devem ser 1 e 2. As 3 últimas entradas são 2, 3 e 3. Existem 2 maneiras de organizar os 2 entre as 2 primeiras entradas e as 2 últimas entradas. Entre as 2 primeiras entradas, existem 2 maneiras de reorganizá-las. Entre as duas últimas entradas, existem 6 maneiras de reorganizá-las.
[1 2 3 4 5] [6 7 8 9 10] => 1
Existe apenas uma maneira, que é o arranjo fornecido nas matrizes.
[1 1 ... 1 1] [1 1 ... 1 1] (10000 numbers) => 10000! or 531950728
Toda permutação possível da segunda matriz é válida.
Caso de teste de Dennis: Pastebin => 583159312 (mod 1000000007)
Pontuação:
Este é o código-golfe, por isso a resposta mais curta vence.
Em caso de empate, os empates serão interrompidos no momento da submissão, favorecendo a submissão anterior.
Tome nota:
Os recipientes podem não ser separados.
Os números inteiros nos contêineres podem ser zero ou negativos.
O programa precisa ser executado com rapidez suficiente (no máximo uma hora) para matrizes de tamanho modesto (com cerca de 10000 de comprimento).
Inspirado por esta pergunta no Mathematics Stack Exchange.
fonte
[. . .]
responder plzRespostas:
CJam,
3026 bytesExperimente on-line no intérprete CJam .
Ele conclui este caso de teste em menos de um segundo:
A execução no intérprete online deve levar menos de 10 segundos.
Algoritmo
O resultado não depende da ordem de A , portanto podemos assumir que ele foi classificado. Isso significa que B também deve ser classificado para atingir o produto de ponto máximo.
Agora, se r 1 ,… r n é o comprimento das execuções do A ordenado , existem kr k ! rearranjos diferentes dos elementos de A que ainda resultam em ordem crescente.
Da mesma forma, se é 1 , ... s n são o comprimento das pistas da ordenada B , há Πs k ! rearranjos diferentes dos elementos de B que ainda resultam em ordem crescente.
No entanto, isso conta todos os pares várias vezes. Se pegarmos os pares dos elementos correspondentes da ordem A e da ordem B e definirmos t 1 ,… t n como o comprimento das execuções da matriz resultante, kt k ! é o multiplicador acima mencionado.
Assim, o resultado desejado é (kr k !) × (∏s k !) ÷ (∏t k !) .
Código
fonte
Pitão,
2928 bytesExperimente online no Pyth Compiler .
Algoritmo
O resultado não depende da ordem de A , portanto podemos assumir que ele foi classificado. Isso significa que B também deve ser classificado para atingir o produto de ponto máximo.
Agora, se r 1 ,… r n é o comprimento das execuções do A ordenado , existem kr k ! rearranjos diferentes dos elementos de A que ainda resultam em ordem crescente.
Da mesma forma, se é 1 , ... s n são o comprimento das pistas da ordenada B , há Πs k ! rearranjos diferentes dos elementos de B que ainda resultam em ordem crescente.
No entanto, isso conta todos os pares várias vezes. Se pegarmos os pares dos elementos correspondentes da ordem A e da ordem B e definirmos t 1 ,… t n como o comprimento das execuções da matriz resultante, kt k ! é o multiplicador acima mencionado.
Assim, o resultado desejado é (kr k !) × (∏s k !) ÷ (∏t k !) .
Código
Verificação
Eu pseudo-gerei aleatoriamente 100 casos de teste de comprimento 6, que resolvi com o código acima e essa abordagem de força bruta:
Estes foram os resultados:
Para verificar se meu envio atende aos requisitos de velocidade, executei-o neste caso de teste .
fonte
Matlab, 230 bytes
Execução
Caso de teste de Dennis:
Saídas:
fonte
C ++, 503 bytes
(apenas por diversão, um idioma que não seja de golfe)
Versão não destruída:
fonte