Contexte
Imaginez un instant que vous avez un travail incroyablement ennuyeux. Chaque matin, on vous donne une collection de tâches que vous devriez travailler ce jour-là. Chaque tâche a une certaine durée et une fois commencée, elle doit être terminée en une seule fois. Votre patron ne tolérera pas la marche au ralenti, donc s'il y a des tâches que vous pouvez encore accomplir avant de rentrer chez vous, vous devez travailler sur l'une d'entre elles (vous pouvez choisir laquelle). À l'inverse, si toutes les tâches restantes vous obligent à faire des heures supplémentaires, vous devez rentrer tôt à la maison! Ainsi, votre objectif est de minimiser la durée de votre journée de travail par une planification intelligente.
Fait amusant: c'est une variante du problème de planification des bureaucrates paresseux , et c'est NP-difficile ( source ).
Contribution
Vous avez deux entrées: le nombre d '"unités de temps" dans votre journée de travail (un entier positif L
) et la collection de tâches (un tableau non vide d'entiers positifs T
, représentant les durées des tâches). Ils peuvent être pris dans n'importe quel ordre et dans n'importe quel format raisonnable. Le tableau T
peut contenir des tâches d'une durée supérieure à L
, mais il est garanti qu'il contiendra au moins une tâche d'une durée maximale L
.
Production
Un planning valide est un sous-ensemble de tâches S ⊆ T
tel que sum(S) ≤ L
, et chaque tâche qui n'est pas dans S
(compter les multiplicités) a une durée strictement supérieure à L - sum(S)
. Votre sortie doit être la plus petite somme possible d'un programme valide. En d'autres termes, vous devez sortir le nombre minimal d'unités de temps que vous devez travailler aujourd'hui.
Exemple
Considérez les entrées
L = 9
T = [3,4,4,4,2,5]
Une façon de planifier votre journée est la suivante [4,4]
: vous terminez deux tâches en 8 unités de temps et il vous reste 1 unité. Comme aucune tâche d'une unité n'est disponible, vous pouvez rentrer chez vous. Cependant, le calendrier [2,5]
est encore meilleur: vous travaillez pour 7 unités de temps, puis toutes les tâches restantes prendraient 3 unités de temps ou plus. L'horaire [2,4]
n'est pas valide, car après avoir travaillé pour 6 unités de temps, vous auriez encore assez de temps pour terminer la tâche de 3 unités. 7 unités se révèle être optimal, donc la sortie correcte est 7
.
Règles et notation
Vous pouvez écrire soit un programme complet soit une fonction. Le nombre d'octets le plus bas l'emporte et les failles standard sont interdites. Il n'y a pas de limite de temps, donc le forçage brut est parfaitement acceptable.
Cas de test
Ceux-ci sont donnés dans le format L T -> output
.
1 [1,2] -> 1
6 [4,1] -> 5
7 [7,7,9] -> 7
9 [3,4,4,4,2,5] -> 7
20 [6,2,3,12,7,31] -> 17
42 [7,7,7,7,8,8,8] -> 36
42 [7,7,7,7,7,8,8,8] -> 35
42 [7,7,7,7,7,7,8,8,8] -> 36
16 [1,2,3,4,5,6,7,8,9,10] -> 13
37 [15,27,4,1,19,16,20,26,29,18] -> 23
22 [24,20,8,8,29,16,5,5,16,18,4,9] -> 18
80 [10,22,11,2,28,20,27,6,24,9,10,6,27,2,15,29,27] -> 71
59 [26,28,5,4,7,23,5,1,9,3,7,15,4,23,7,19,16,25,26] -> 52