CCINP Informatique MPI 2023Sujet, corrigé et rapport du jury
- Complexité algorithmique
- Programmation dynamique
- Algorithme de Manacher
- Programmation fonctionnelle en OCaml (listes)
- Graphes et coupe minimum
- Algorithmes probabilistes (Monte Carlo, Las Vegas)
- Structures de données en C (struct, Union-Find)
Téléchargements
Présentation du sujet
Difficulté moyennePalindromes, traversée de rivière en OCaml et coupe minimum d'un grapheAfficher ou masquer la section
Présentation du sujet
Difficulté moyenneLe sujet comporte trois parties indépendantes. La première étudie le décompte du nombre de palindromes d'un mot par trois approches successives, jusqu'à l'algorithme de Manacher en temps linéaire. La deuxième fait coder en OCaml la résolution d'un problème de traversée de rivière par des randonneurs. La troisième, qui constitue le problème principal, étudie l'algorithme probabiliste de Karger pour calculer une coupe minimum d'un graphe, avec une implémentation en langage C.
- 1Partie I : palindromesDécompte du nombre de palindromes d'un mot par un algorithme naïf, puis par programmation dynamique, puis par l'algorithme de Manacher fondé sur le rayon d'un palindrome.
- 2Partie II : traversée de rivièreRésolution en OCaml d'un problème d'algorithmique discrète où deux groupes de randonneurs doivent se croiser sur un chemin de cailloux.
- 3Partie III : calcul d'une coupe minimum d'un grapheÉtude de l'algorithme probabiliste de Karger fondé sur la contraction d'arêtes, analyse de sa probabilité de succès, puis implémentation en langage C avec une structure Union-Find.
Difficulté moyenne. Le rapport qualifie le sujet de difficulté raisonnable, avec une longueur adaptée qui a permis à beaucoup de candidats d'aller jusqu'au bout, une moyenne de 11,38 sur 20 et un écart-type de 3,18 qui a bien discriminé les niveaux.
L'épreuve en chiffres
Moyenne 11,38 / 20 · écart-type 3,18 · 703 présents · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 11,38/ 20
- Écart-type
- 3,18
- Présents
- 703
- Coefficient
- 12
- Durée
- 4 h
Votre note sur 20 à ce sujet, en conditions de concours.
Source : document officiel du concours, épreuve du 26 avril 2023. Notes publiées par le concours (après harmonisation le cas échéant). Courbe : estimation par une loi normale.
Ce qu'a observé le jury
6 erreurs relevéesRédaction insuffisante sur une question de dénombrement · Signature de fonction OCaml mal maîtrisée · Type de retour mal identifiéAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesLe sujet, avec une composante algorithmique et de programmation importante, a permis à chaque candidat ayant un minimum de prérequis de s'exprimer, notamment grâce à quelques questions très simples. Le niveau de programmation a été jugé globalement correct, malgré quelques erreurs de syntaxe OCaml et des méconnaissances du langage C, en particulier sur la manipulation du type struct.
Les erreurs les plus sanctionnées
- 1Rédaction insuffisante sur une question de dénombrementQ13
La question 13 sur la complexité de l'algorithme de Manacher a assez souvent été mal rédigée.
« La Q13 a assez souvent été mal rédigée. »
- 2Signature de fonction OCaml mal maîtriséeQ19
Les difficultés liées à l'écriture de la signature attendue ont fait que cette question n'a été que très partiellement traitée, malgré une longueur de sujet par ailleurs adaptée.
« en raison de difficultés liées à la signature de la Q19, cette dernière n'a été que très partiellement traitée. »
- 3Type de retour mal identifiéQ18
Certains candidats n'ont pas compris que la fonction demandée devait renvoyer une liste d'états.
« quelques étudiants n'ont pas compris que l'on attendait une liste d'états. »
- 4Manipulation des struct en C mal maîtrisée
Les erreurs proviennent régulièrement d'une mauvaise manipulation des types de données, en particulier des struct en langage C.
« mauvaise manipulation de types de données (struct en C notamment) »
- 5Question trop ouverte peu traitéeQ27
Cette question de démonstration a été peu abordée, sans doute parce que son énoncé était jugé trop ouvert par les candidats.
« La Q27 a été peu traitée, sans doute car trop ouverte dans son énoncé. »
- 6Dernière question de code peu abordéeQ36
La fonction demandant de déduire la taille de la coupe calculée par l'algorithme de Karger a été peu traitée, probablement faute de temps en fin d'épreuve.
« La Q36 n'a été en revanche que peu traitée. »
Ce qui a été bien réussi
- La partie I sur les palindromes a été globalement bien traitée.
- La partie II sur la traversée de rivière, jugée facile, a été globalement bien traitée par les candidats, hormis la question 19.
- La quasi-totalité des copies aborde au moins la question 33 de la partie III, et de nombreux candidats vont jusqu'à la question 35.
Conseils du jury
- Bien lire et respecter exactement la signature de fonction demandée par l'énoncé.
- Vérifier précisément le type de retour attendu (par exemple une liste plutôt qu'une valeur unique).
- Soigner la manipulation des types structurés en C, notamment les struct.
- Travailler la compréhension de l'analyse probabiliste, en particulier pour la partie sur les algorithmes de type Monte Carlo et Las Vegas.
Synthèse rédigée par WikiPrépa à partir du rapport officiel du jury (à télécharger en PDF). Les citations sont extraites du rapport.
Ces sujets peuvent vous intéresser
Lecture du sujet en ligne
L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.Afficher ou masquer la section
Lecture du sujet en ligne
ÉPREUVE MUTUALISÉE AVEC E3A-POLYTECH ÉPREUVE SPÉCIFIQUE - FILIÈRE MPI
NFORMATIQUE
N.B. : le candidat attachera la plus grande importance à la clarté, à la précision et à la concision de la rédaction. Si un candidat est amené à repérer ce qui peut lui sembler être une erreur d'énoncé, il le signalera sur sa copie et devra poursuivre sa composition en expliquant les raisons des initiatives qu'il a été amené à prendre.
RAPPEL DES CONSIGNES
- Utiliser uniquement un stylo noir ou bleu foncé non effaçable pour la rédaction de votre composition ; d'autres couleurs, excepté le vert, peuvent être utilisées, mais exclusivement pour les schémas et la mise en évidence des résultats.
- Ne pas utiliser de correcteur.
- Écrire le mot FIN à la fin de votre composition.
Les calculatrices sont interdites.
Partie I-Palindromes
Soit
Définition 2 (Palindrome)
Par convention, le mot vide
On dira qu'un palindrome
En parcourant naïvement les lettres d'un mot
Algorithme 1 - Décompte naïf du nombre de palindromes contenus dans un mot donné.
Entrées : Un mot $u$.
Sorties: Le nombre de palindromes contenus dans $u$.
début
$\mathrm{nb}=0$
pour $i=0$ à $|u|-1$ faire
pour $j=0$ à $|u|-1$ faire
estPalindrome=True
pour $k=i$ à $j-1$ faire
si $u[i] \neq u[j-k-1]$ alors
estPalindrome=False
Sortir du pour $k$
si estPalindrome alors
$\mathrm{nb}=\mathrm{nb}+1$
retourner $n b$
On souhaite bien sûr améliorer cette première idée. Pour ce faire, on utilise tout d'abord le paradigme de la programmation dynamique.
Pour
Q3. Soit
Q5. Écrire un algorithme de programmation dynamique en pseudo-code résolvant le problème.
Évaluer sa complexité.
Q6. Montrer que les palindromes de
Q7. Soit
Q9. En déduire une stratégie de recherche de tous les palindromes de
On voit que les palindromes impairs sont importants. On va donc construire un algorithme de recherche de ce type de palindrome.
Soient
(i).
(ii).
(iii).
Par exemple, si
Q10. En remarquant qu'un palindrome impair est centré sur une lettre (ou un symbole spécial dans le cas de
Algorithme 2 - Algorithme de Manacher
Entrées : Un mot $u$
Sorties : Un tableau $T$.
début
Initialiser un tableau $T$ de $|u|$ cases, initialisées à 0
$k=0$
pour $i=1$ à $|u|-1$ faire
$j=i-k$
si $T[k] \geq j$ alors
$T[i]=\min (T[k-j], T[k]-j)$
tant que $(i-(T[i]+1)) \geq 0$ ET $(i+T[i]+1)<|u| \mathbf{E T}(u[i-(T[i]+1)]=u[i+T[i]+1])$ faire
$T[i]=T[i]+1$
$k=i$
retourner $T$
Q13. Quelle est la complexité de cet algorithme ? Justifier.
Partie II - Traversée de rivière
Dans une vallée des Alpes, un passage à gué fait de cailloux permet de traverser la rivière. Deux groupes de randonneurs arrivent simultanément sur les berges gauche et droite de cette rivière et veulent la traverser. Le chemin étant très étroit, une seule personne peut se trouver sur chaque caillou de ce chemin (figure 1). Un randonneur sur la berge de gauche peut avancer d'un caillou (vers la droite sur la figure 1) et sauter par dessus le randonneur devant lui (un caillou à droite) si le caillou où il atterit est libre. De même, chaque randonneur de la berge de droite peut avancer d'un caillou (vers la gauche sur la figure 1) et sauter par dessus le randonneur devant lui, dans la mesure où le caillou sur lequel il atterit est libre. Une fois engagés, les randonneurs ne peuvent pas faire marche arrière. De plus, pour simplifier, on suppose qu'une fois tous les randonneurs sur le chemin, il ne reste qu'un caillou de libre.

type chemin_caillou = int array
Q14. Écrire une fonction de signature caillou_vide : chemin_caillou -> int qui détermine la position du caillou inoccupé.
On supposera dans la suite les fonctions de signature randonneurD_avance : chemin_caillou -> bool et randonneurD_saute : chemin_caillou -> bool écrites de manière similaire pour les randonneurs venant de la berge de droite.
(i). déplacement d'un randonneur venant de la berge de gauche,
(ii). déplacement d'un randonneur venant de la berge de droite,
(iii). saut d'un randonneur venant de la berge de gauche,
(iv). saut d'un randonneur venant de la berge de droite.
Par exemple, List.init 5 (fun
Q19. Écrire une fonction de signature passage : int -> int, utilisant la question précédente, telle que l'appel passage nG nD résout le problème de passage de nG randonneurs venant de la berge de gauche et nD randonneurs venant de la berge de droite. Par exemple, passage 32 permet de passer de
Partie III - Calcul d'une coupe minimum d'un graphe
Définition 4 (Multigraphe)
Définition 5 (Coupe)
Une coupe minimum est une coupe de taille minimale.
Pour trouver une coupe minimum d'un multigraphe
III. 1 - Contraction d'arête
(i). créer un nouveau sommet
(ii). pour toute arête
(iii). Supprimer de
(iv). Supprimer
Le multigraphe obtenu est appelé graphe contracté et est noté
On considère le graphe

Après plusieurs contractions, un supersommet
III. 2 - Premier algorithme
Algorithme 3 - Algorithme de Karger.
$\operatorname{Karger}(G, n)$
Entrées : $G=(S, A)$ multigraphe non orienté, $n \in \mathbb{N}$
Sorties : Une coupe minimum de $G$.
début
pour $i=|S|$ à $n$ en décrémentant de 1 faire
Tirer aléatoirement (loi uniforme) une arête $a=(s, t) \in A$
$G=G / s t$
// Appel
$\underline{\operatorname{Karger}(G, 2)}$
D'après la Q23, tant que l'on ne contracte pas une arête faisant partie de toutes les coupes minimum de
Q26. En déduire qu'une coupe minimum a une taille d'au plus
Soit
Q27. Quelle est la probabilité maximum de choisir une arête qui traverse
Q28. En déduire que la probabilité
III. 3 - Deuxième algorithme
Algorithme 4 - Algorithme de Karger amplifié.
KargerAmplifie( $G, N$ )
Entrées : $G=(S, A)$ multigraphe non orienté, $N \in \mathbb{N}$.
Sorties : Une coupe minimum de $G$.
début
$t=\infty$
pour $i=1$ à $N$ faire
$X=\operatorname{Karger}(G, 2)$
si $|X|<t$ alors
$t=|X|$
$C=X$
retourner $C$
III. 4 - Implémentation en langage C
Pour tout
On suppose donc disposer :
(i). d'un type subset, décrivant un supersommet d'un graphe contracté.
struct subset
{
int parent; // recherche par compression de chemin pour Trouver
int rang; // Union par rang.
};
typedef struct subset subset;
(iii). d'une fonction de prototype void Unir(subset subsets[], int Su, int Sv) qui fusionne les deux supersommets
II n'est pas demandé d'écrire ces deux dernières fonctions.
Q34. Écrire une fonction de prototype int contracteArete (Graphe G, subset subsets[], Arete a) qui contracte l'arête a. On veillera à ne pas contracter l'arête si ses deux extrémités sont dans le même supersommet. La fonction renvoie 0 si aucune arête est contractée et -1 sinon.
FIN
Questions fréquentes
4 questionsSur quels chapitres porte l'épreuve d'informatique CCINP MPI 2023 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte l'épreuve d'informatique CCINP MPI 2023 ?
Le sujet porte sur le dénombrement de palindromes (programmation dynamique, algorithme de Manacher), un problème d'algorithmique discrète codé en OCaml, puis l'algorithme probabiliste de Karger pour calculer une coupe minimum d'un graphe, implémenté en C.
Quelle est la moyenne de l'épreuve d'informatique CCINP MPI 2023 ?
La moyenne de l'épreuve est de 11,38 sur 20 avec un écart-type de 3,18, ce qui a permis de bien discriminer les candidats de niveau faible et ceux de niveau élevé.
Ce sujet d'informatique MPI est-il difficile ?
Le rapport le juge de difficulté raisonnable, avec une longueur adaptée qui a permis à beaucoup de candidats d'aller jusqu'au bout du sujet.
Quelles erreurs reviennent le plus souvent sur ce sujet ?
Le rapport relève une mauvaise manipulation des struct en C, une syntaxe C parfois incorrecte, des difficultés sur l'analyse probabiliste de la partie III, ainsi qu'une signature de fonction OCaml mal maîtrisée à la question 19.
Pas de description pour le moment
