Un voyageur doit rester n jours dans un hôtel situé en dehors de la ville. Il n'a plus d'argent et sa carte de crédit est expirée. Mais il a une chaîne en or avec n liens.
La règle dans cet hôtel est que les résidents doivent payer leur loyer tous les matins. Le voyageur conclut un accord avec le responsable pour payer un maillon de la chaîne en or chaque jour. Mais le responsable exige également que le voyageur fasse le moins de dégâts possible à la chaîne en payant tous les jours. En d'autres termes, il doit trouver une solution pour couper le moins de liens possible.
Couper un lien crée trois sous-chaînes: une contenant uniquement le lien coupé et une de chaque côté. Par exemple, couper le troisième maillon d'une chaîne de longueur 8 crée des sous-chaînes de longueur [2, 1, 5]. Le responsable est heureux de rendre la monnaie, de sorte que le voyageur puisse payer le premier jour avec la chaîne de longueur 1, puis le deuxième jour avec la chaîne de longueur 2, en récupérant la première chaîne.
Votre code doit entrer la longueur n et générer une liste de liens à couper de longueur minimale.
Règles :
- n est un entier> 0.
- Vous pouvez utiliser l'indexation 0 ou 1 pour les liens.
- Pour certains numéros, la solution n'est pas unique. Par exemple, si les
n = 15
deux[3, 8]
et[4, 8]
sont des sorties valides. - Vous pouvez soit renvoyer la liste, soit l’imprimer avec un séparateur raisonnable.
- C'est le code-golf , donc le code le plus court en octets gagne.
Cas de test :
Input Output (1-indexed)
1 []
3 [1]
7 [3]
15 [3, 8]
149 [6, 17, 38, 79]
Exemple détaillé
Pour n = 15, couper les liens 3 et 8 donne des sous-chaînes de longueur [2, 1, 4, 1, 7]
. C'est une solution valable pour les raisons suivantes:
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
Il n’existe pas de solution avec une seule découpe, c’est donc une solution optimale.
Addenda
Notez que ce problème est lié au partitionnement entier. Nous sommes à la recherche d'une partition P de n tel que tous les entiers de 1 à n ont au moins un patition qui est un sous - ensemble de P .
Voici une vidéo YouTube sur un algorithme possible pour ce problème.
1+2
. D'où vient la deuxième chaîne à 2 maillons?