Énoncé

On cherche à réaliser un algorithme de rendu de pièces pour un distributeur automatique. Ce distributeur est destiné à être mis en place dans des pays de la zone euro, et on cherche à en simplifier au maximum la maintenance.

On part donc avec le problème suivant : on a un nombre de pièces limité et connu dans la machine. Lorsqu'un paiement est réalisé, les pièces utilisées par le consommateur sont mises dans un pot commun et ne sont donc pas réutilisables pour rendre la monnaie. On va chercher à rendre la monnaie avec un nombre minimal de pièces, afin de garder un maximum de pièces dans la machine.

Cependant, on veut limiter au maximum le temps d'indisponibilité de la machine. Lorsqu'une machine n'a plus assez de pièce pour rendre la monnaie, il faut faire intervenir un technicien, qui va venir remplir la machine (et vider le pot commun). Cette intervention est coûteuse, et le temps pendant lequel la machine ne peut plus rendre la monnaie entraîne un préjudice financier non négligeable. On veut donc garder la machine opérationnelle le plus longtemps possible, et prévenir le technicien au bon moment.

Pour atteindre ce résultat, on introduit la notion de réserve de pièces. Le but est de garder cette réserve intacte le plus longtemps possible. Lorsque cette réserve est entamée, le technicien est appelé et en attendant sa venue on va pouvoir utiliser les pièces qui s'y trouvent, en cherchant toujours à minimiser le nombre de pièces rendues. La réserve est de 2 pièces de 2 euros, 4 pièces de 1€, 4 pièces de 50 cts, 5 pièces de 20 cts, 4 pièces de 10 cts, 4 pièces de 5 cts, 5 pièces de 2 cts, et 4 pièces de 1 cts.

Dans cet exercice, on vous donne à chaque fois le prix à payer et le prix payé par le client, tous les prix sont donnés en centimes. On vous donne également le nombre de chacune des pièces initialement dans la machine. Les valeurs des pièces sont triées par ordre décroissant.

Entrée

L'entrée du programme est donnée sur 3 lignes :

Sortie

La sortie sera le nombre de pièces nécessaires pour rendre la monnaie (-1 si impossible) en essayant avant tout de ne pas entamer la réserve, suivi d'un 1 si il faut appeler le technicien pour reremplir, ou d'un 0 si le distributeur n'a pas entamé la réserve. On appellera le technicien si la réserve est déjà entamée avant même de rembourser le client. Le paiement du client sera toujours suffisant.

Exemples

EntréeSortie

Squelette CamlLight Corrigé

Squelette OCaml