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