sfondo
La disuguaglianza di riorganizzazione è una disuguaglianza che si basa sulla riorganizzazione dei numeri. Se ho due elenchi di numeri della stessa lunghezza, x 0 , x 1 , x 2 ... x n-1 e y 0 , y 1 , y 2 ... y n-1 della stessa lunghezza, dove I posso riorganizzare i numeri nell'elenco, un modo per massimizzare la somma x 0 y 0 + x 1 y 1 + x 2 y 2 + ... + x n-1 y n-1 è quello di ordinare i 2 elenchi in ordine non decrescente.
Leggi l' articolo di Wikipedia qui.
Compito
Si scriverà un programma che accetta input da STDIN o una funzione che accetta 2 matrici (o relativi contenitori) di numeri (che sono della stessa lunghezza).
Supponendo che tu scriva una funzione che accetta 2 array (aeb), troverai il numero di modi in cui puoi riorganizzare i numeri nel secondo array (b) per massimizzare:
a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+...+a[n-1]*b[n-1]
In questo caso, se l'array b è [1 0 , 2 1 , 2 2 , 3 3 , 3 4 ] (indici per chiarezza),
[1 0 , 2 1 , 2 2 , 3 3 , 3 4 ],
[1 0 , 2 1 , 2 2 , 3 4 , 3 3 ], (scambia le due 3)
[1 0 , 2 2 , 2 1 , 3 3 , 3 4 ] (scambia i due 2)
[1 0 , 2 2 , 2 1 , 3 4 , 3 3 ] (scambia i due 3 e scambia i due 2)
sono considerati accordi diversi. L'array originale, di per sé, conta anche come possibile riorganizzazione se massimizza anche la somma.
Per l'input STDIN, è possibile supporre che la lunghezza delle matrici sia fornita prima delle matrici (si prega di indicare in modo da utilizzarla) o che le matrici siano fornite su linee diverse (si prega di indicare anche).
Ecco i 4 possibili ingressi (per comodità):
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)
Per l'output, è possibile restituire la risposta (se si scrive una funzione) o stampare la risposta su STDOUT. Puoi scegliere di emettere la risposta mod 10 9 +7 (da 0 a 10 9 +6) se è più conveniente.
Casi di prova (e spiegazione):
[1 1 2 2 2] [1 2 2 3 3] => 24
Le prime 2 voci devono essere 1 e 2. Le ultime 3 voci sono 2, 3 e 3. Esistono 2 modi per disporre i 2 tra le prime 2 voci e le ultime 2 voci. Tra le prime 2 voci, ci sono 2 modi per riordinarle. Tra le ultime 2 voci, ci sono 6 modi per riordinarle.
[1 2 3 4 5] [6 7 8 9 10] => 1
C'è solo 1 modo, che è la disposizione data negli array.
[1 1 ... 1 1] [1 1 ... 1 1] (10000 numbers) => 10000! or 531950728
Ogni possibile permutazione del secondo array è valida.
Dennis 'Testcase: Pastebin => 583159312 (mod 1000000007)
punteggio:
Questo è code-golf, quindi vince la risposta più breve.
In caso di parità, i legami verranno interrotti al momento della presentazione, favorendo la presentazione precedente.
Prendi nota:
I contenitori potrebbero non essere ordinati.
I numeri interi nei contenitori possono essere zero o negativi.
Il programma deve funzionare abbastanza velocemente (al massimo un'ora) per array di dimensioni modeste (circa 10000 di lunghezza).
Ispirato da questa domanda sullo scambio di stack di matematica.
[. . .]
plz respond