Antecedentes
La desigualdad de reordenamiento es una desigualdad que se basa en reorganizar números. Si tengo dos listas de números de la misma longitud, x 0 , x 1 , x 2 ... x n-1 e y 0 , y 1 , y 2 ... y n-1 de la misma longitud, donde yo se me permite reorganizar los números en la lista, una forma de maximizar la suma x 0 y 0 + x 1 y 1 + x 2 y 2 + ... + x n-1 y n-1 es ordenar las 2 listas en orden no decreciente.
Lea el artículo de Wikipedia aquí.
Tarea
Escribiría un programa que tome datos de STDIN o una función que acepte 2 matrices (o contenedores relacionados) de números (que son de la misma longitud).
Suponiendo que escribe una función que acepta 2 matrices (ayb), encontrará la cantidad de formas en que puede reorganizar los números en la segunda matriz (b) para maximizar:
a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+...+a[n-1]*b[n-1]
En este caso, si la matriz b es [1 0 , 2 1 , 2 2 , 3 3 , 3 4 ] (índices de claridad),
[1 0 , 2 1 , 2 2 , 3 3 , 3 4 ],
[1 0 , 2 1 , 2 2 , 3 4 , 3 3 ], (intercambie los dos 3)
[1 0 , 2 2 , 2 1 , 3 3 , 3 4 ] (intercambie los dos 2)
[1 0 , 2 2 , 2 1 , 3 4 , 3 3 ] (intercambia los dos 3 y cambia los dos 2)
se consideran diferentes arreglos. La matriz original, en sí misma, también cuenta como una posible reorganización si también maximiza la suma.
Para la entrada STDIN, puede suponer que la longitud de las matrices se proporciona antes de las matrices (indique para que la use), o que las matrices se proporcionan en diferentes líneas (también indique).
Aquí están las 4 entradas posibles (por conveniencia):
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 la salida, puede devolver la respuesta (si escribe una función) o imprimir la respuesta en STDOUT. Puede optar por enviar la respuesta mod 10 9 +7 (de 0 a 10 9 +6) si es más conveniente.
Casos de prueba (y explicación):
[1 1 2 2 2] [1 2 2 3 3] => 24
Las primeras 2 entradas deben ser 1 y 2. Las últimas 3 entradas son 2, 3 y 3. Hay 2 formas de organizar los 2 entre las primeras 2 entradas y las últimas 2 entradas. Entre las primeras 2 entradas, hay 2 formas de reorganizarlas. Entre las últimas 2 entradas, hay 6 formas de reorganizarlas.
[1 2 3 4 5] [6 7 8 9 10] => 1
Solo hay 1 forma, que es la disposición dada en las matrices.
[1 1 ... 1 1] [1 1 ... 1 1] (10000 numbers) => 10000! or 531950728
Toda permutación posible de la segunda matriz es válida.
Dennis 'Testcase: Pastebin => 583159312 (mod 1000000007)
Puntuación:
Este es el código de golf, por lo que gana la respuesta más corta.
En caso de empate, los empates se romperán en el momento de la presentación, favoreciendo la presentación anterior.
Tomar nota:
Los contenedores pueden estar sin clasificar.
Los enteros en los contenedores pueden ser cero o negativos.
El programa tiene que ejecutarse lo suficientemente rápido (como máximo una hora) para matrices de tamaño modesto (alrededor de 10000 de longitud).
Inspirado por esta pregunta en Mathematics Stack Exchange.
fuente
[. . .]
Respuestas:
CJam,
3026 bytesPruébelo en línea en el intérprete de CJam .
Completa este caso de prueba en menos de un segundo:
Ejecutarlo en el intérprete en línea debería tomar menos de 10 segundos.
Algoritmo
El resultado no depende del orden de A , por lo que podemos suponer que está ordenado. Esto significa que B también debe clasificarse para obtener el producto punto máximo.
Ahora, si r 1 , ... r n son la longitud de las corridas de la A ordenada , ¡hay ∏r k ! diferentes reordenamientos de los elementos de A que todavía resultan en orden ascendente.
Del mismo modo, si s 1 , ... s n son la longitud de las corridas de la B ordenada , ¡hay ∏s k ! diferentes reordenamientos de los elementos de B que todavía resultan en orden ascendente.
Sin embargo, esto cuenta todas las parejas varias veces. Si tomamos los pares de los elementos correspondientes de ordenado A y ordenado B y definimos t 1 , ... t n como la longitud de las corridas de la matriz resultante, ∏t k ! es el multiplicador mencionado anteriormente.
Por lo tanto, el resultado deseado es (∏r k !) × (∏s k !) ÷ (∏t k !) .
Código
fuente
Pyth,
2928 bytesPruébelo en línea en el compilador Pyth .
Algoritmo
El resultado no depende del orden de A , por lo que podemos suponer que está ordenado. Esto significa que B también debe clasificarse para obtener el producto punto máximo.
Ahora, si r 1 , ... r n son la longitud de las corridas de la A ordenada , ¡hay ∏r k ! diferentes reordenamientos de los elementos de A que todavía resultan en orden ascendente.
Del mismo modo, si s 1 , ... s n son la longitud de las corridas de la B ordenada , ¡hay ∏s k ! diferentes reordenamientos de los elementos de B que todavía resultan en orden ascendente.
Sin embargo, esto cuenta todas las parejas varias veces. Si tomamos los pares de los elementos correspondientes de ordenado A y ordenado B y definimos t 1 , ... t n como la longitud de las corridas de la matriz resultante, ∏t k ! es el multiplicador mencionado anteriormente.
Por lo tanto, el resultado deseado es (∏r k !) × (∏s k !) ÷ (∏t k !) .
Código
Verificación
He generado seudoaleatoriamente 100 casos de prueba de longitud 6, que he resuelto con el código anterior y este enfoque de fuerza bruta:
Estos fueron los resultados:
Para verificar que mi envío satisfaga el requisito de velocidad, lo ejecuté con este caso de prueba .
fuente
Matlab, 230 bytes
Ejecución
Dennis 'Testcase:
Salidas:
fuente
C ++, 503 bytes
(solo por diversión, un lenguaje que no es de golf)
Versión sin golf:
fuente