Bem, quando compro presentes para minhas duas esposas, quero que elas se sintam igualmente importantes para mim, mas é difícil fazer compras com orçamentos fixos. Em vez disso, compro um monte de coisas e as divido em dois grupos com o mesmo valor possível. Então eu compro um monte de chocolates para consertar o resto.
Mas eu não quero fazer todo o trabalho duro quando meu computador pode fazer isso. E você também não. Portanto, resolva esse problema para que da próxima vez que você precise dividir presentes entre suas esposas, saiba que seria fácil.
Entrada
1 matriz de (N * 2) elementos em que N * 2 é especificado na 1ª linha.
Os elementos da matriz na seguinte linha.
Resultado
2 matriz de N elementos, cada um deles:
Diferença de (Soma dos elementos da matriz 1) e (Soma dos elementos da matriz 2) é o mais próximo possível de 0.
Exemplo
Entrada
4
1 2 3 4
Resultado
1 4
2 3
diff=0
Disclaimer : Eu não tenho duas esposas. Mas quando me sinto mal, imagino ter duas esposas. E, de repente, estou agradecido e feliz por ter apenas um. : D
fonte
1 1 1 1 1 5
a resposta correta seria1 1 1
|1 1 5
enquanto1 1 1 1 1
|5
faria mais sentido.Respostas:
Java
Tentando resolver esse problema em duas fases:
Entrada como
já foi resolvido após a fase 1, como por exemplo
e entrada como
precisará das duas fases para que
(após a fase um) torna-se o resultado de
Embora eu possa garantir que essa tentativa sempre forneça uma solução, não posso provar que uma solução ideal seja encontrada em todos os casos. Com a restrição de listas de tamanhos iguais, no entanto, parece bastante realista que não haja casos de canto deixados para trás. Prove que estou errado ;-)
Programa em ideone.com
fonte
Braquilog 2
Experimente online!
Este é um concurso de popularidade, mas isso não significa necessariamente que os idiomas do golfe sejam inadequados. (Realmente, eu deveria ter respondido no Jelly porque as respostas do Jelly tendem a receber um número desproporcional de votos por algum motivo, independentemente de quem os submeta ou de como são jogados, mas o Brachylog é mais legível.)
Começamos pegando a lista de todas as permutações da entrada (
pᶠ
) e dividindo cada (ᵐ
) em duas partes iguais (ḍ
; poderíamos dar um índice se você tivesse mais de duas esposas por algum motivo). Em seguida, ordenamos as permutações de divisão ({…}ᵒ
) pegando a soma (+
) de cada (ᵐ
) metade, pegando a diferença absoluta (ou sejao-
, "diferença ordenada") e usando essas diferenças para definir a ordem de classificação. O melhor resultado é o primeiro, por isso assumimos o topo da listah
para obter o resultado.fonte
Mathematica
Formulários de entrada
A sequência de entrada deve ser obtida através do STDIN.
assets
refere-se aos valores a serem distribuídos entre as esposas (ou gêmeas).length
é o número de ativos.Para os propósitos atuais, assumiremos que os ativos consistem nos números inteiros de 1 a 20.
Em processamento
A distribuição é injusta? Então, escolha outro.
@ O Construtor observa que a esposa 2 pode contestar o fato de a esposa 1 ter todos os melhores ativos. Portanto, o seguinte produz todas as ações "justas" (diferença = menor diferença) para a esposa 1; a esposa 2 obtém os ativos restantes; o zero refere-se à diferença de bens para as esposas. Existem 5448 maneiras de distribuir ativos de 1 a 20. Apenas algumas linhas são exibidas.
O formato é
O envio prévio pode ser encontrado entre as edições. É muito mais ineficiente, contando com isso
Permutations
.fonte
J
Há uma folha de dicas com todas as primitivas J neste link , caso você queira acompanhar em casa. Lembre-se: J geralmente é lido da direita para a esquerda, ou
3*2+1
seja, 7, e não 9. Todo verbo (J para função) é monádico, portanto, na frentef y
, ou diádico, entre os mesmosx f y
.Notas e explicações:
u/
significa "dobraru
", portanto, execute a operação binária sobre cada elemento da lista. Por exemplo:+/
significa Fold Plus ou Sum ;<.
é Menor ,<./
significa Dobrar Menor ou Mínimo .u"1
significa "executaru
em células unidimensionais", ou seja, em todas as linhas. Normalmente, os verbos em J são atômicos ou se aplicam a todo o argumento. Isso se aplica a ambos os argumentos, se o verbo for usado de forma diádica (com dois argumentos). Considere o seguinte:#:
é um verbo que expande um número em sua representação binária. Quando você o usa em uma lista com mais de um elemento, ele também alinha todos os números corretamente, para que#:i.2^n
você obtenha todas as seqüências binárias de comprimenton
./.
, quando usado de forma diádica, é chamado de chave . Ele usa os elementos da lista no lado esquerdo como chaves e os do lado direito como valores. Ele agrupa cada conjunto de valores que compartilham uma chave e, em seguida, executa alguma operação neles.No caso de
]/.
, a operação é apenas o verbo de identidade, então nada de especial está acontecendo lá, mas o fato de que/.
particionar a lista para nós é a parte importante. É por isso que criamos as listas binárias: para que, para cada lista ("1
), possamos dividir os presentes para as esposas de todas as maneiras possíveis.1!:1]1
e1!:2&2
são as operações de leitura e gravação, respectivamente. A1!:n
parte é o verbo e o outro número é o identificador do arquivo.1
está dentro do console,2
está fora do console e3 4 5
são stdin, stdout e stderr. Também usamos".
na leitura para converter as seqüências de entrada em números.fonte
Clojure
Teste
fonte
[1 4 5 6 7 8]
seu programa calculado[8 5 4]
[7 6 1]
Diff 3
onde claramente existem soluções com uma diferença de 1.MATLAB
Aqui está a minha solução:
Por exemplo, a lista atual no meu código-fonte resulta em:
que é ambos 16.
Se eu golf meu código, o que é menos divertido, recebo 132 caracteres não otimizados. Bata isso;)
fonte
PHP
Aviso: código muito sujo
Ele tenta todas as permutações possíveis da matriz de entrada.
Amostra de Ideone para
4/1 2 3 4
: http://ideone.com/gIi174fonte
Pitão:
ou um pouco golfificado:
Ou ainda mais golfificado, já que metade das linhas é apenas maquiagem. (supondo que eu possa simplesmente despejar a matriz interna bruta, já que isso não está especificado no op) Você pode deixar de fora o
print
shell interativo (por exemplo), e adicionar um[::-1]
(logo após[0]
) se desejar o diff por último.(resulta em
(0, ((1, 2, 7, 8), (3, 4, 5, 6)))
)Isso, no entanto, apenas impõe brutalidade a todas as combinações possíveis e não deve ser considerado remotamente eficiente. No entanto, se a lista ter comprimentos iguais não importa, isso também funcionaria (em matrizes grandes):
Com o código abaixo, por exemplo, ele roda com quase nenhuma diferença: 500k em 10 ^ 10 valor máximo não é muito, por assim dizer. Isso também é muito mais rápido: onde o outro código provavelmente não terminaria em menos de um ano (e isso é muito otimista), isso ocorre em cerca de meio segundo, mesmo que sua milhagem possa variar.
fonte
Haskell alfabetizado
Eu usei a mônada da lista para dividi-la.
Então fazemos um avaliador.
E então uma função que minimizará a diferença.
E algo que combina todos eles.
Em seguida, um analisador.
E um formatador de saída.
E agora o programa
Exemplo:
fonte