Bueno, cuando compro regalos para mis dos esposas, quiero que se sientan igualmente importantes para mí, pero es difícil ir de compras con presupuestos fijos. En cambio, compro un montón de cosas y las divido en dos grupos con el mismo valor posible. Luego compro un montón de bombones para arreglar el resto.
Pero no quiero hacer todo el trabajo duro cuando mi computadora puede hacerlo. Y tú tampoco. Así que resuelva este problema para que la próxima vez que necesite dividir los regalos entre sus esposas, sepa que sería fácil.
Entrada
1 conjunto de elementos (N * 2) donde N * 2 se especifica en la primera línea.
Los elementos de la matriz en la siguiente línea.
Salida
2 conjuntos de N elementos cada uno de manera que: La
diferencia de (Suma de elementos del conjunto 1) y (Suma de elementos del conjunto 2) sea lo más cercana posible a 0.
Ejemplo
Entrada
4
1 2 3 4
Salida
1 4
2 3
diff=0
Descargo de responsabilidad : no tengo dos esposas. Pero cuando me siento mal, imagino tener dos esposas. Y de repente, estoy agradecido y feliz de tener solo uno. :RE
fuente
1 1 1 1 1 5
la respuesta correcta sería1 1 1
|1 1 5
, mientras que1 1 1 1 1
|5
Tendría más sentido.Respuestas:
Java
Intentando resolver este problema en dos fases:
Entrada como
ya está resuelto después de la fase 1 como p. ej.
y entrada como
necesitará ambas fases para que
(después de la fase uno) se convierte en el resultado de
Si bien puedo garantizar que este intento siempre proporcionará una solución, no puedo demostrar que se encuentre una solución óptima en todos los casos. Sin embargo, con la restricción de listas de igual tamaño, parece bastante realista que no queden casos de esquina. Prueba que estoy equivocado ;-)
Programa en ideone.com
fuente
Brachylog 2
Pruébalo en línea!
Este es un concurso de popularidad, pero eso no significa necesariamente que los idiomas de golf no encajen bien. (Realmente, debería haber respondido en Jelly porque las respuestas de Jelly tienden a obtener una cantidad desproporcionada de votos a favor por alguna razón, independientemente de quién los envíe o cuán golfizados estén, pero Brachylog es más legible).
Comenzamos tomando la lista de todas las permutaciones de la entrada (
pᶠ
), y dividiendo cada (ᵐ
) en dos partes iguales (ḍ
; podríamos asignarle un subíndice si tuviera más de dos esposas por alguna razón). Luego ordenamos las permutaciones divididas ({…}ᵒ
) tomando la suma (+
) de cada (ᵐ
) mitad, tomando la diferencia absoluta (es deciro-
, "diferencia ordenada") y usando esas diferencias para definir el orden de clasificación. El mejor resultado es el primero, por lo que tomamos el encabezado de la listah
para obtener el resultado.fuente
Mathematica
Formularios de entrada
La cadena de entrada debe tomarse a través de STDIN.
assets
se refiere a las cantidades que se distribuirán entre las esposas (o gemelas).length
es la cantidad de activos.A los fines del presente, asumiremos que los activos consisten en los enteros del 1 al 20.
Procesando
¿Es injusta la distribución? Entonces, elige otro.
@The Constructor señala que la esposa 2 puede cuestionar el hecho de que la esposa 1 obtuvo todos los mejores activos. Entonces, lo siguiente produce todas las acciones "justas" (diferencia = diferencia más baja) para la esposa 1; la esposa 2 obtiene los activos restantes; el cero se refiere a la diferencia en activos para las esposas. Hay 5448 formas de distribuir activos ponderados del 1 al 20. Solo se muestran unas pocas líneas.
El formato es
La presentación previa se puede encontrar entre las ediciones. Es mucho más ineficiente, confiando como lo hace
Permutations
.fuente
J
Hay una hoja de trucos de todas las primitivas J en este enlace , en caso de que quiera seguirlo en casa. Recuerde: J generalmente se lee de derecha a izquierda, por lo que
3*2+1
es 7, no 9. Cada verbo (J para función) es monádico, por delantef y
, o diádico, por lo tanto, entrex f y
.Notas y explicaciones:
u/
significa "doblaru
", así que realice la operación binaria sobre cada elemento de la lista. Entonces, por ejemplo:+/
significa Fold Plus o Sum ;<.
es Menor de , entonces<./
significa Plegar Menor de , o Mínimo .u"1
significa "realizaru
en celdas unidimensionales", es decir, en cada fila. Normalmente, los verbos en J son atómicos o se aplican a todo el argumento. Esto se aplica a ambos argumentos si el verbo se usa de forma diádica (con dos argumentos). Considera lo siguiente:#:
es un verbo que expande un número en su representación binaria. Cuando lo usa en una lista con más de un elemento, también alineará todos los números correctamente, de modo que#:i.2^n
obtendrá cada cadena binaria de longitudn
./.
, Cuando se usa diádica, que se denomina clave . Utiliza los elementos de la lista en el lado izquierdo como claves y los del lado derecho como valores. Agrupa cada conjunto de valores que comparten una clave y luego realiza alguna operación en ellos.En el caso de
]/.
, la operación es solo el verbo de identidad, por lo que no está sucediendo nada completamente especial allí, pero el hecho de que/.
dividirá la lista para nosotros es lo importante. Es por eso que creamos las listas binarias: para que para cada lista ("1
), podamos repartir los regalos para las esposas de todas las formas posibles.1!:1]1
y1!:2&2
son las operaciones de lectura y escritura, respectivamente. La1!:n
parte es el verbo y el otro número es el identificador de archivo.1
está dentro de la consola,2
está fuera de la consola y3 4 5
son stdin, stdout y stderr. También usamos".
cuando leemos para convertir las cadenas de entrada a números.fuente
Clojure
Prueba
fuente
[1 4 5 6 7 8]
su programa calculado[8 5 4]
[7 6 1]
Diff 3
donde claramente existen soluciones con una diferencia de 1.MATLAB
Aquí está mi solución:
Por ejemplo, la lista actual en mi código fuente da como resultado:
que es ambos 16.
Si juego mi código, que es menos divertido, obtengo 132 caracteres muy poco optimizados. Supera eso ;)
fuente
PHP
Advertencia: código muy sucio
Intenta todas las permutaciones posibles de la matriz de entrada.
Muestra de ideona para
4/1 2 3 4
: http://ideone.com/gIi174fuente
Pitón:
o un poco golfificado:
O incluso más golfificado, ya que la mitad de las líneas es solo maquillaje. (suponiendo que pueda volcar la matriz interna sin procesar, ya que esto no se especifica en la operación) Puede dejar de lado el
print
(por ejemplo) el shell interactivo y agregar un[::-1]
(al final, después[0]
) si realmente desea La diferencia es la última.(resultados en
(0, ((1, 2, 7, 8), (3, 4, 5, 6)))
)Esto, sin embargo, es solo la fuerza bruta de todas las combinaciones posibles, y no debe considerarse remotamente eficiente. Sin embargo, si la lista tiene igual longitud, esto también funcionaría (en matrices grandes):
Con el código debajo de esto, por ejemplo, se ejecuta con apenas una diferencia: 500k con un valor máximo de 10 ^ 10 no es mucho, por así decirlo. Esto también es mucho más rápido: donde el otro código probablemente no terminaría en menos de un año (y eso es muy optimista), esto se ejecuta en aproximadamente medio segundo, a pesar de que su kilometraje puede variar.
fuente
Haskell alfabetizado
Hice uso de la lista mónada para dividirlo.
Luego hacemos un evaluador.
Y luego una función que minimizará la diferencia.
Y algo que los combina a todos.
Luego un analizador.
Y un formateador de salida.
Y ahora el programa
Ejemplo:
fuente