Un viaggiatore deve rimanere per n giorni in un hotel fuori città. Ha esaurito i contanti e la sua carta di credito è scaduta. Ma ha una catena d'oro con n collegamenti.
La regola in questo hotel è che i residenti dovrebbero pagare l'affitto ogni mattina. Il viaggiatore raggiunge un accordo con il gestore per pagare un anello della catena d'oro per ogni giorno. Ma il manager richiede anche che il viaggiatore debba fare il minimo danno possibile alla catena mentre paga ogni giorno. In altre parole, deve trovare una soluzione per tagliare il minor numero possibile di collegamenti.
Il taglio di un collegamento crea tre subchain: uno contenente solo il collegamento tagliato e uno su ciascun lato. Ad esempio, il taglio del terzo anello di una catena di lunghezza 8 crea delle catene secondarie di lunghezza [2, 1, 5]. Il gestore è felice di apportare modifiche, in modo che il viaggiatore possa pagare il primo giorno con la catena di lunghezza 1, quindi il secondo giorno con la catena di lunghezza 2, riprendendo la prima catena.
Il tuo codice dovrebbe inserire la lunghezza n e produrre un elenco di collegamenti da tagliare di lunghezza minima.
Regole :
- n è un numero intero> 0.
- È possibile utilizzare l'indicizzazione basata su 0 o 1 per i collegamenti.
- Per alcuni numeri, la soluzione non è unica. Ad esempio, se
n = 15
entrambi[3, 8]
e[4, 8]
sono output validi. - È possibile restituire l'elenco o stamparlo con qualsiasi separatore ragionevole.
- Questo è code-golf , quindi vince il codice più breve in byte.
Casi di prova :
Input Output (1-indexed)
1 []
3 [1]
7 [3]
15 [3, 8]
149 [6, 17, 38, 79]
Esempio dettagliato
Per n = 15, tagliando i collegamenti 3 e 8 si ottengono subchain di lunghezza [2, 1, 4, 1, 7]
. Questa è una soluzione valida perché:
1 = 1
2 = 2
3 = 1+2
4 = 4
5 = 1+4
6 = 2+4
7 = 7
8 = 1+7
9 = 2+7
10 = 1+2+7
11 = 4+7
12 = 1+4+7
13 = 2+4+7
14 = 1+2+4+7
15 = 1+1+2+4+7
Non esiste una soluzione con un solo taglio, quindi questa è una soluzione ottimale.
appendice
Si noti che questo problema è correlato al partizionamento intero. Stiamo cercando una partizione P di n tale che tutti i numeri interi da 1 a n abbiano almeno una patizione che è un sottoinsieme di P .
Ecco un video di YouTube su un possibile algoritmo per questo problema.
1+2
. Da dove viene la seconda catena a 2 maglie?