Premier puzzle de ma part, des suggestions d'amélioration reçues avec plaisir!
Le scénario est; Vous travaillez en tant que manager pour une entreprise de rafting en eau vive. Chaque matin, une liste de réservations vous est remise et vous devez les trier en radeaux. Écrivez un programme ou une fonction dans la langue de votre choix qui le fait pour vous.
Chaque radeau peut accueillir un maximum de n
clients, et chaque réservation est pour un groupe entre 1 et n
personnes (inclus). Les règles suivantes doivent être respectées;
Aucun groupe ne peut être divisé. S'ils ont réservé ensemble, ils doivent tous être dans le même radeau.
Le nombre de radeaux doit être minimisé.
Sous réserve des deux règles précédentes, les groupes doivent être répartis le plus équitablement possible entre les radeaux.
Contributions.
Le nombre n
(vous pouvez supposer qu'il s'agit d'un entier positif) et la taille de toutes les réservations. Il peut s'agir d'un tableau, d'une liste ou d'une structure de données similaire si votre langue prend en charge de telles choses. Tous ces éléments seront des entiers positifs compris entre 1 etn
. L'ordre des réservations n'est pas défini, ni important.
Production. Une liste des numéros de réservation, regroupés en radeaux. Le groupement doit être indiqué sans ambiguïté, tel que;
- une liste ou un tableau de tableaux.
- une liste séparée par des virgules pour chaque radeau. Retour à la ligne entre chaque radeau.
La façon dont vous implémentez la troisième règle dépend de vous, mais cela pourrait impliquer de trouver l'occupation moyenne du radeau et de minimiser autant que possible les écarts par rapport à celle-ci. Voici quelques cas de 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]
Les règles standard s'appliquent, le code le plus court l'emporte. S'amuser!
Édité; Une façon suggérée de définir le plus équitablement possible la troisième règle.
Une fois le nombre de radeaux r
déterminé (sous réserve de la deuxième règle), l'occupation moyenne a
peut être calculée en additionnant les réservations et en divisant par r
. Pour chaque radeau, l'écart par rapport à l'occupation moyenne peut être trouvé en utilisant d(x) = abs(n(x)-a)
, où n(x)
est le nombre de personnes dans chaque radeau et 1 <= x <= r
. Pour une fonction continue, à valeur unique f(y)
, qui est strictement positive et qui a une première dérivée strictement positive et une seconde dérivée non négative pour tout positif y
, nous définissons une quantité non négative F
, comme la somme de tous les f(d(x)), 1 <= x <= r
. Tout choix d'allocation de radeaux qui satisfait aux deux premières règles et où F
est égal au minimum global satisfera également la troisième règle.
g(y) = y
(deuxième dérivé zéro) ou g(y) = y²
(premier dervier zéro quand y = 0
).