Primo puzzle da parte mia, suggerimenti di miglioramento accolti volentieri!
Lo scenario è; Lavori come manager per una compagnia di rafting in acque bianche. Ogni mattina ti viene fornito un elenco di prenotazioni e devi ordinarle in carichi di zattera. Scrivi un programma o una funzione nella lingua che hai scelto per te.
Ogni zattera detiene un massimo di n
clienti e ogni prenotazione è per un gruppo compreso tra 1 e n
persone (incluso). Devono essere rispettate le seguenti regole;
Nessun gruppo può essere diviso. Se hanno prenotato insieme, devono essere tutti nella stessa zattera.
Il numero di zattere deve essere ridotto al minimo.
Fatte salve le due regole precedenti, i gruppi devono essere distribuiti il più equamente possibile tra le zattere.
Ingressi.
Il numero n
(si può presumere che si tratti di un numero intero positivo) e la dimensione di tutte le prenotazioni. Questo può essere un array, un elenco o una struttura di dati simile se la tua lingua supporta tali elementi. Tutti questi saranno numeri interi positivi tra 1 e n
. L'ordine delle prenotazioni non è definito, né è importante.
Produzione. Un elenco dei numeri di prenotazione, raggruppati in carichi zattera. Il raggruppamento deve essere indicato in modo inequivocabile, ad esempio;
- un elenco o una matrice di array.
- un elenco separato da virgole per ogni zattera. Newline tra ogni zattera.
Il modo in cui implementate la terza regola dipende da voi, ma ciò potrebbe comportare la ricerca dell'occupazione media della zattera e la riduzione al minimo delle deviazioni da essa. Ecco alcuni casi di test.
n Bookings Output
6 [2,5] [5],[2]
4 [1,1,1,1,1] [1,1,1],[1,1]
6 [2,3,2] [2,2],[3]
6 [2,3,2,3] [2,3],[2,3]
6 [2,3,2,3,2] [2,2,2],[3,3]
12 [10,8,6,4,2] [10],[8,2],[6,4]
6 [4,4,4] [4],[4],[4]
12 [12,7,6,6] [12],[7],[6,6]
Si applicano le regole standard, vince il codice più breve. Divertiti!
Modificato; Un modo suggerito per definire il più equamente possibile per la terza regola.
Una volta determinato il numero di zattere r
(soggetto alla seconda regola), l'occupazione media a
può essere calcolata sommando le prenotazioni e dividendo per r
. Per ogni zattera, la deviazione dall'occupazione media può essere trovata usando d(x) = abs(n(x)-a)
, dove n(x)
è il numero di persone in ogni zattera e 1 <= x <= r
. Per alcune funzioni continue a valore singolo f(y)
, che sono strettamente positive e hanno un primo derivato rigorosamente positivo e secondi non negativi per tutti i positivi y
, definiamo una quantità non negativa F
, come la somma di tutti i f(d(x)), 1 <= x <= r
. Qualsiasi scelta di allocazione della zattera che soddisfi le prime due regole e dove F
sia uguale al minimo globale soddisferà anche la terza regola.
g(y) = y
(secondo zero derivato) o g(y) = y²
(primo derviato zero quando y = 0
) però.