1 Permutations

publicité
1ère Année ENSEIRB option Telecom
Algorithmique et structure de données
Devoir d’entraı̂nement (facultatif ) à rendre le 13 octobre.
1
Permutations
Une permutation α de Sn est une suite de n nombres entiers
α = a0 , a1 , . . . , an−1
tous différents et compris entre 0 et n − 1.
On pourra considérer aussi α comme une bijection de {0, 1, . . . , n − 1} dans lui même
et on notera ainsi ai = α(i).
1. Une descente dans une permutation est un entier i tel que ai > ai+1 Écrire un
algorithme qui étant donnée une permutation représentée par un tableau alpha
affiche le nombre de ses descentes. Par exemple si la donnée est le tableau
i
0 1 2 3 4 5 6 7 8
alpha[i] 7 2 5 0 6 3 4 1 8
l’algorithme doit afficher 4.
2. Une inversion dans une permutation est un couple i, j tel que i < j et ai > aj .
par exemple, le nombre d’inversions de la permutation donnée plus haut est 18.
On vous demande d’écrire un algorithme qui affiche le nombre d’inversions d’une
permutation représentée par son tableau.
3. Ecrire un algorithme qui vérifie si un tableau de taille donnée n représente bien une
permutation, c’est à dire s’il contient bien tous les nombres entiers compris entre
0 et n − 1. La donnée sera un tableau et l’algorithme devra afficher est ou n’est
pas une permutation.
4. Un cycle dans une permutation est une suite de nombres i1 , i2 , . . . , ip tels que α(ij ) =
ij+1 pour j = 1, . . . p − 1 et α(ip ) = i1 . Par exemple la permutation ci-dessus a 3
cycles qui sont
(0, 7, 1, 2, 5, 3)(4, 6) et (8).
On vous demande d’écrire un algorithme qui détermine le nombre de cycles d’une
permutation donnée par un tableau. On utilisera un tableau auxiliaire vu contenant
des booléens tous initialisés à false, et tel que vu[i] est mis à true quand on
considère l’élement i dans l’ensemble des cycles parcourus.
1
2
Rendre la monnaie
On vous propose d’écrire un algorithme permettant d’obtenir la suite des billets totalisant
une somme donnée (dont on suppose qu’elle est un multiple de 10). Les espèces disponibles
sont des billets de 50, 20 et 10 euros. Le principe est de donner le billet de valeur la plus
grande possible inférieure ou égale à la somme à rendre et de poursuivre la même stratégie
avec la somme restante jusqu’à ce que la somme restante soit nulle.
1. Écrire cet algorithme en utilisant les structures de contrôle suivantes : while ,
if et else if . L’algorithme utilisera une variable nommée s qui contiendra
la somme restant à rendre au fur et à mesure de la remise de billets au client. On
n’utilisera comme opérations arithmétiques que des additions ou des soustractions.
Le résultat sera l’affichage de la suite des nombres de billets à rendre.
Par exemple si la somme est 180, l’affichage devra être :
3 billets de 50 euros
1 billet de 20 euros
1 billet de 10 euros
2. Déterminer le nombre de soustractions effectuées par l’algorithme ; on donnera une
formule faisant intervenir des divisions entières par les nombres 50, 20 et 10.
3. On souhaite démontrer que pour toute somme s (multiple de 10) le nombre de
billets obtenus par l’algorithme précédent est le plus petit possible. Pour cela vous
considérerez les 5 possibilités de la valeur du reste de la division par 50 de la somme
s.
4. Généraliser votre algorithme de détermination du nombre de billets à rendre au cas
où les valeurs de billets disponibles sont en nombre quelconque et figurent dans un
tableau à valeurs décroissantes val[0] > val[1] > ... > val[k-1]. Ainsi dans
l’exemple considéré plus haut on aurait : k = 3 et val[0] = 50, val[1] = 20,
val[2] = 10.
5. Montrer qu’ il existe des valeurs de billets et une somme à rendre pour lesquels cet
algorithme ne donne pas le nombre minimum de billets ou à rendre.
2
Téléchargement