Les condensateurs sont connus pour être fabriqués avec des tolérances élevées. Ceci est acceptable dans de nombreux cas, mais parfois une capacité avec des tolérances serrées est requise. Une stratégie courante pour obtenir une capacité avec la valeur exacte dont vous avez besoin consiste à utiliser deux condensateurs soigneusement mesurés en parallèle de sorte que leurs capacités s'additionnent à quelque chose dans la plage dont vous avez besoin.
Le but de ce défi est, étant donné un (multi) ensemble de capacités, de coupler les condensateurs de telle sorte que la capacité totale de chaque paire soit dans une plage donnée. Vous devez également trouver le meilleur ensemble de paires, c'est-à-dire l'ensemble de paires de sorte que le plus de paires possibles soient trouvées.
Contraintes
- L'entrée comprend dans un format de choix
- une liste non ordonnée de capacités représentant le (multi) ensemble de condensateurs que vous avez
- une paire de capacités représentant la limite inférieure et supérieure de la plage cible (inclus)
- toutes les capacités en entrée sont des entiers positifs inférieurs à 2 30 , l'unité est pF (pas ce qui compte).
- En plus de la liste des capacités en entrée, l'ensemble de condensateurs que vous avez contient également une quantité infinie de condensateurs d'une valeur de 0 pF.
- La sortie comprend dans un format de choix une liste de paires de capacités de telle sorte que la somme de chaque paire soit dans la plage cible spécifiée. Ni l'ordre des paires ni l'ordre des capacités au sein d'une paire n'est spécifié.
- Aucune capacité en sortie ne peut apparaître plus souvent qu'elle n'apparaît dans l'ensemble de condensateurs dont vous disposez . En d'autres termes: les paires que vous générez ne doivent pas se chevaucher.
- Il ne doit pas y avoir de sortie satisfaisant aux conditions 4 et 5 contenant plus de paires de capacités que la sortie produite par votre programme.
- Votre programme se terminera en temps O ( n !) Où n est la longueur de la liste représentant l'ensemble des condensateurs que vous avez
- Il ne faut pas abuser des échappatoires
- La plage cible ne doit pas être vide
Notation
Votre score est la longueur de votre solution en octets. Si votre solution parvient à résoudre ce problème en temps polynomial O ( n k ) pour certains k , divisez votre score par 10. Je ne sais pas si c'est réellement possible.
Exemple d'entrée
plage 100 à 100, tableau d'entrée
100 100 100
, sortie valide:0 100 0 100 0 100
plage 100 à 120, tableau d'entrée
20 80 100
, sortie valide:0 100 20 80
la sortie
20 100
n'est pas valideplage 90 à 100, tableau d'entrée
50 20 40 90 80 30 60 70 40
, sortie valide:0 90 20 80 30 70 40 60 40 50
plage 90 à 90, tableau d'entrée
20 30 40 40 50 60 70 80 90
, sortie valide:0 90 20 70 30 60 40 50
plage 90 à 110, tableau d'entrée
40 60 50
, sortie valide:40 60
a <= b <= c <= d
quia + d, a + c, b + d
sont tous dans la plage, maisb + c
ne le sont pas, mais cela donne une contradiction.Réponses:
CJam, 5,6
Il s'agit d'une réimplémentation directe de l'algorithme dans la réponse d' orlp . Si vous votez pour ma réponse, assurez-vous que vous votez également pour cette réponse . Je suggère également que la réponse avec l'algorithme d'origine soit acceptée, car je doute fort que j'aurais compris comment résoudre cela avec élégance dans O (n * log (n)).
Essayez-le en ligne
Exemple d'entrée:
Explication:
la source
Python 2, 11,5
Un golf Python pour une fois:
J'ajoute un condensateur 0 pF pour chaque régulier, il n'y en a plus jamais besoin. Ensuite, nous trions les condensateurs et continuons d'associer le condensateur le plus bas et le plus élevé. Si la somme est dans la plage autorisée, nous l'imprimons, si elle est au-dessus de la plage, nous rejetons la plus élevée, si elle est inférieure à la plus basse.
Exemple d'entrée / sortie:
la source