نموذج المباراة الوطنية المشتركة CNC 2019: المعلوميات - شعبة PSI لولوج مدارس المهندسين
⬇️ تحميل PDF الرابط الدائم: https://www.wadifa-info.com/نموذج-مباراة/1746/نموذج-المباراة-الوطنية-المشتركة-CNC-2019-المعلوميات-شعبة-PSI-لولوج-مدارس-المهندس
باختصار
هذا نموذج امتحان كتابي سابق لمباراة مباراة ولوج المدارس العليا للمهندسين لدى المباراة الوطنية المشتركة CNC (الأقسام التحضيرية) (2019)، منشور على وظيفة إنفو للاطلاع والتحميل المجاني بصيغة PDF مع تصحيح مقترح.
- الجهة المنظمة
- المباراة الوطنية المشتركة CNC (الأقسام التحضيرية)
- الدرجة
- مباراة ولوج المدارس العليا للمهندسين
- التخصص
- المعلوميات
- الدورة
- 2019
- عدد الصفحات
- 12
- لغة الأسئلة
- الفرنسية
- التصحيح
- تصحيح مقترح متوفر في هذه الصفحة
📝 نص أسئلة النموذج (مستخرج آلياً من الصفحات الممسوحة)
استُخرج هذا النص آلياً من صور الامتحان وقد يحتوي على أخطاء في القراءة — الصور أعلاه هي المرجع.
— صفحة 1 — Épreuve d’Informatique — Session 2019 - Filière PSI Les candidats sont informés que la précision des raisonnements algorithmiques ainsi que le soin apporté à la rédaction et à la présentation des copies seront des éléments pris en compte dans la notation. ١ convient en particulier de rappeler avec précision les références des questions abordées. Si, au cours de l'épreuve, un candidat repère ce qui peut lui sembler être une erreur d'énoncé, il le signale sur sa copie et poursuit sa composition en expliquant les raisons des initiatives qu'il est amené à prendre. Remarques générales : * Cette épreuve est composée d’un exercice et d’un problème indépendants ; * Toutes les instructions et les fonctions demandées seront écrites en Python ; * Les questions non traitées peuvent être admises pour aborder les questions ultérieures ; * Toute fonction peut être décomposée, si nécessaire, en plusieurs fonctions. ند ند ند ند ند اند ند ند ند ند ند ند ند ند ند ند ند ند ند ند ند ند ند انه Exercice : (4 points) Somme et factoriel 1pt Q1- Écrire la fonction factoriel (k) qui reçoit en paramètre un entier positif k et qui renvoie la valeur du factoriel de k : k! =1*2*3* ...*k. Exemples : e Lafonction factoriel (5) renvoie le nombre :120=1*2*3*4*5 e Lafonction factoriel (0) renvoie le nombre : 1 05pt = Q2- Déterminer la complexité de la fonction factoriel (k), et justifier votre réponse. 1.5 pt Q3- Écrire la fonction som_fact (L) qui reçoit en paramètre une liste L de nombres entiers positifs. La fonction renvoie la somme des factoriels des éléments de L. Exemple : La fonction som_fact (L) renvoie la valeur de la somme : 5! + 3! + O! + 6! + 1! 1 pt Q4- Déterminer la complexité de la fonction som_fact (L), et justifier votre réponse. لالم للم لمالم الال لمالمل ا لصل مالم الاقم Page 1 sur 12 نماذج المباريات من موقع وظيفة إنفو wadifa-info.com — صفحة 2 — Épreuve d’Informatique — Session 2019 - Filière PSI Problème : Réseau routier Figure 1 : Extrait du réseau routier du Maroc Un réseau routier peut être représenté par un dessin qui se compose de points et de traits continus reliant deux à deux certains de ces points : les points sont les villes, et les lignes sont les routes. On considère que toutes les routes sont à double sens. Chaque route peut être affectée par une valeur qui peut représenter le temps ou la distance entre deux villes, … Étant donné un réseau routier, on pourra s'intéresser à la résolution des problèmes suivants : = Quel est le plus court chemin entre deux villes ? = Entre deux villes, quel est le nombre de chemins passant par un nombre de routes donné ? = Est-il possible de passer par toutes les villes du réseau, sans passer deux fois par une même ville ?, si oui, quel est le plus court chemin ? = Entre deux villes, quel est le chemin ayant le moindre coût ? Partie I : Modélisation d’un réseau routier On considère un réseau routier composé de n villes (avec n = 2). Les villes du réseau routier sont numérotées par des entiers allant de 0 à n-1. Exemple : Page 2 sur 12 نماذج المباريات من موقع وظيفة إنفو wadifa-info.com — صفحة 3 — Epreuve d’Informatique — Session 2019 - Filière PSI Figure 2 : Réseau routier composé de 15 routes, et de 8 villes numérotées de 0 à 7. Pour plus de clarté, tous les exemples de ce problème seront appliqués sur le réseau routier de la figure 2. Représentation du réseau routier Pour représenter un réseau routier de n villes, on utilise une matrice symétrique R d'ordre n (n lignes et n colonnes), telle que : Pour toutes les villes i et j, telles que O‹i‹n et O‹j‹n,ona: › R[i,j1]= R[j,i]=1, s’il existe une route qui relie entre la ville i et la ville j ; Exemple : Le réseau routier de la figure 2 est représenté par la matrice symétrique R, d’ordre 8, suivante : NB : Dans la matrice symétrique R, les lignes i et les colonnes j représentent les villes du réseau routier. 1. 1- Représentation de la matrice du réseau routier en Python Pour représenter la matrice symétrique R d'ordre n, on utilise une liste composée de n listes qui sont toutes de même longueur n. Page 3 sur 12 نماذج المباريات من موقع وظيفة إنفو wadifa-info.com — صفحة 4 — Épreuve d’Informatique — Session 2019 - Filière PSI Exemple : La matrice symétrique R, du réseau routier de la figure 2, est représentée par la liste R, composée de 8 listes, de taille 8 chacune : R[i] [j] est l'élément de R, à “نوا ligne et la j°"° colonne. Exemples : R[0][0] est l’élément : 0, et R[0][2] est l'élément : 1 R[i] est la ligne d'indice i dans R. Exemple : R[0] est la liste [O,1,1,1,0,0,0,0], qui représente la ligne d’indice 0 dans la matrice R. Q 1- À partir de la matrice symétrique R de la figure 2, donner les résultats des expressions suivantes : I. 2- Villes voisines i et j sont deux villes dans un réseau routier représenté par une matrice symétrique R. Les villes i et j sont voisines, s'il existe une route entre la vaille i et la ville j. Q 2. a- Écrire la fonction voisines (i, j,R), qui reçoit en paramètres deux villes i et j d’un réseau routier représenté par la matrice symétrique R. La fonction renvoie True si les villes i et j sont voisines, sinon, la fonction renvoie False. Exemples : e La fonction voisines (3, 0, R) renvoie True ; (les villes 3 et O sont voisines) e La fonction voisines (3, 5, R) renvoie False. (les villes 3 et 5 ne sont pas voisines) Q 2. b- Écrire la fonction 1ist_voisines (i,R), qui reçoit en paramètres une ville i d’un réseau routier représenté par la matrice symétrique R. La fonction renvoie la liste de toutes les villes voisines à la ville i. Exemple : La fonction list_voisines (3, R) renvoie la liste des villes voisines à la ville 3:[0,2,4,6,7] I. 3- Degré d’une ville Dans un réseau routier, le degré d'une ville i est le nombre de villes voisines à la ville i. Q 3- Écrire la fonction degre (i, R), qui reçoit en paramètres une ville i d’un réseau routier représenté par la matrice symétrique R. La fonction renvoie le degré de la ville i. Exemples : e La fonction degre (3, R) renvoie le nombre :5 (La ville 3 possède 5 villes voisines) e 12 fonction degre (0, R) renvoie le nombre :3 (La ville 0 possède 3 villes voisines) e La fonction degre (2, R) renvoie le nombre :4 (La ville 2 possède 4 villes voisines) Page 4 sur 12 نماذج المباريات من موقع وظيفة إنفو wadifa-info.com — صفحة 5 — Épreuve d’Informatique — Session 2019 - Filière PSI 1. 4- Liste des degrés des villes Q 4. Écrire la fonction liste_degres (R), qui reçoit en paramètre la matrice symétrique 8 représentant un réseau routier. La fonction renvoie une liste D contenant des tuples. Chaque tuple de D est composé de deux éléments : une ville du réseau routier, et le degré de cette ville. Exemple : La fonction liste_degres (R) renvoie la liste D suivante : I. 5- Tri des villes Q 5. a- Écrire la fonction tri_degres (D), qui reçoit en paramètre la liste D des degrés des villes. La fonction trie les tuples de la liste D dans l’ordre décroissant des degrés des villes. Exemple : Après l'appel de la fonction tri_degres (D), on obtient la liste suivante : Q 5. b- Écrire la fonction tri_villes(R), qui reçoit en paramètre la matrice symétrique R représentant un réseau routier. La fonction renvoie la liste des villes triées dans l'ordre décroissant des degrés des villes. Exemple : La fonction tri_villes (R) renvoie la liste des villes triées dans l'ordre décroissant des degrés : Partie II : Coloration optimale des villes d’un réseau routier Une coloration des villes du réseau routier est une affectation de couleurs à chaque ville, de façon à ce que deux villes voisines soient affectées par deux couleurs différentes. Le nombre minimum de couleurs nécessaires pour colorier un réseau routier est appelé : nombre chromatique. La recherche du nombre chromatique est une question qui intervient dans beaucoup de problèmes concrets : y L'établissement d'emplois du temps ; “la gestion de ressources partagées ; آ la compilation dans l'utilisation efficace des registres ; On cherche à construire une liste © qui contiendra les couleurs des villes. Ces couleurs seront représentés par des entiers strictement positifs : chaque élément C[k] contiendra la couleur de la ville k du réseau routier. Page 5 sur 12 نماذج المباريات من موقع وظيفة إنفو wadifa-info.com — صفحة 6 — Épreuve d’Informatique — Session 2019 - Filière PSI Pour construire la liste C des couleurs, on propose d’utiliser un algorithme, appelé : algorithme de glouton. C'est un algorithme couramment utilisé dans la résolution de ce genre de problèmes, afin d'obtenir des solutions optimales. Principe de l’algorithme de glouton : V est la liste des villes triées dans l’ordre décroissant des degrés des villes C est une liste de même taille que V, initialisée par des 0 Pour toute ville k de V : C[k] € première couleur non utilisée par les villes voisines à la ville k Retourner la liste C IT. 6- Premier entier qui n’existe pas dans une liste d’entiers Q 6- Écrire la fonction premier entier (L), qui reçoit en paramètre une liste ا de nombres entiers positifs. La fonction renvoie le premier entier positif qui n'appartient pas à la liste L. Exemple : La fonction premier_entier([0,0,3,1,0,1,0,0]) renvoie le nombre : 2 II. 7- Liste des couleurs des villes voisines à une ville Q 7- Écrire la fonction couleurs_voisines (k,C,R), qui reçoit en paramètres une ville k d'un réseau routier représenté par la matrice symétrique R, et la liste C des couleurs des villes du réseau. La fonction renvoie la liste des C[i] telle que i est une ville voisine à la ville k. Exemples : e La fonction couleurs_voisines (4, [ 0, 0, 0, 1, 0, O, 0, 0 ], R) renvoie la liste : [O, O, 1, 0, 0] e Lafonction couleurs _voisines (2, [ 0, 0, 0, 1, 2, 0, 0, 0 ], R) renvoie la liste: [O, O, 1, 2] e La fonction couleurs_voisines (6, [ 0, 0, 3, 1, 2, 0, 0, 0 ], R) renvoie la liste: [1, 2, 0, 0] e La fonction couleurs voisines (0, [ 0, 0, 3, 1, 2, 0, 3, 0 ], R) renvoie la liste: [O, 3, 1] II. 8- Coloration des villes Q 8- Écrire la fonction couleurs_villes (R), qui reçoit en paramètre la matrice symétrique R représentant un réseau routier. La fonction renvoie la liste C des couleurs des villes, en utilisant le principe de glouton cité ci-dessus. Exemple : La fonction couleurs_villes (R) renvoie la liste des couleurs :C=[2,1,3,1,2,1,3,2] Dans cette liste C : e Les villes 0, 4 et 7 ont la même couleur : 2 ; e Lesvilles 1,3 et5 ont la même couleur : 1 ; e Les villes 2 et 6 ont la même couleur : 3. NB : Dans cet exemple, le nombre chromatique est 3. Page 6 sur 12 نماذج المباريات من موقع وظيفة إنفو wadifa-info.com — صفحة 7 — Épreuve d’Informatique — Session 2019 - Filière PSI Partie III : Chemins dans un réseau routier II. 9- Chemin entre deux villes Dans un réseau routier, un chemin est un tuple T qui contient des villes du réseau, et qui satisfait les deux conditions suivantes : › 61 : Le tuple T contient au moins deux villes du réseau routier ; › c2 : Deux villes consécutives dans T sont voisines. Exemples : e Letuple (2, 0,1, 4,3 ( est un chemin entre la ville 2 et la ville 3, composé de 4 routes ; e Letuple ( 7, 6, 4, 5, 6, 3, 4 ) est un chemin entre la ville 7 et la ville 4, composé de 6 routes ; e Letuple (3, 1, 4, 7 ) n'est pas un chemin. Q 9- Écrire la fonction chemin_valide (T,R), qui reçoit en paramètres un tuple T contenant des villes du réseau routier représenté par la matrice symétrique R. La fonction renvoie True si le tuple T satisfait les deux conditions c1 et c2 citées ci-dessus, sinon, la fonction renvoie False. 111. 10- Chemin simple entre deux villes Dans un réseau routier, un chemin simple est un chemin qui passe une seule fois par la même ville. Exemples : e Le chemin ( 2, 0, 1, 4, 3 ) est un chemin simple entre la ville 2 et la ville 3 ; e Le chemin ( 6, 7, 3, 4, 2, 3, 6, 5 ) n’est pas simple. Q 10- Écrire la fonction chemin_simple (T,R), qui reçoit en paramètres un chemin T dans un réseau routier représenté par la matrice symétrique R. La fonction renvoie True si le chemin T est un simple, sinon, la fonction renvoie False. 111. 11- Plus court chemin entre deux villes On suppose que la fonction liste_chemins (i, j,R), reçoit en paramètres deux villes i et j d’un réseau routier représenté par la matrice symétrique R. Cette fonction renvoie une liste qui contient tous les chemins simples entre la ville i et la ville j. Exemple : La fonction liste_chemins (1, 5, R) renvoie la liste de tous les chemins simples entre les villes 1 et 5 : Page 7 sur 12 نماذج المباريات من موقع وظيفة إنفو wadifa-info.com — صفحة 8 — Épreuve d’Informatique — Session 2019 - Filière PSI Le plus court chemin entre une ville i et une ville j est un chemin simple entre la ville i et la ville j, et qui traverse le moins de villes. NB : On peut trouver plusieurs plus courts chemins entre deux villes. Q 11- Écrire la fonction pe_chemins (i, j, R), qui reçoit en paramètres deux villes i et j d’un réseau routier représenté par la matrice symétrique R. Cette fonction renvoie la liste de tous les plus courts chemins entre la ville i et la ville j. Exemples : e La fonction pc_chemins (0, 7, R) renvoie la liste [ (0 , 3 , 7) ] ; e La fonction pc_chemins (7, 1, R) renvoie la liste : Partie IV : Calcul du nombre de chemins entre deux villes Dans cette partie, on considère que le module numpy est importé : from numpy import * On suppose que le réseau routier est représenté par la matrice symétrique R, et que la matrice R est créée par la méthode array() du module numpy. Exemple : Dans cette partie, on propose de résoudre le problème suivant : Soit p un entier strictement positif. Quel est le nombre de chemins (simples ou non) entre une ville i et une ville j, passant exactement par p routes ? Par exemple, dans le réseau routier de la figure 2, pour aller de la ville 1 à la ville 3, en passant exactement par 5 routes, on peut trouver plusieurs chemins, dont voici quelques uns : Pour résoudre ce problème, on doit procéder ainsi : = Calculer la matrice M = R” (matrice symétrique R élevée à la puissance p) = Chaque élément M[i][j] représente le nombre de chemins, entre la ville i et la ville j, passant par p routes ; = La matrice M est symétrique aussi. Le nombre de chemins, entre la ville i et la ville j, est le même que celui entre la ville j et la ville i. Page 8 sur 12 نماذج المباريات من موقع وظيفة إنفو wadifa-info.com — صفحة 9 — Épreuve d’Informatique — Session 2019 - Filière PSI Exemples : 31213011 4 8 810 5 5 5 2 1 3 2 31 1 18) 8 4 8 510 2 5 |5] 2 2 4 2 2 1 1 8 8 81111 5 6 5 1 3 252 3 2 1 10 511 815 5 11 10 31225 1 2 3 5 10 1115 8 10 11 5 6011318321 5 2 5 510 4 8 8 1.1.2 2 2 2 4 2 5 5 61111 8 8 8 1011 1 3 1 2 3 2 510 5 8 84 Par exemple, entre la ville 1 et la ville 7 : e |lya0 chemins qui passent exactement par deux routes (dans la matrice M = ضع ; e |lya5 chemins qui passent exactement par trois routes (dans la matrice M = R°). IV. 12- Produit matriciel Rappel : On considère la matrice A, de m lignes et n colonnes, et la matrice B de n lignes et p colonnes. En effectuant le produit matriciel de À et B, on obtient la matrice C de m lignes et p colonnes, sachant que les coefficients de la matrice C sont calculés par la formule suivante : 12-1 Cy = ›, Air * Brj k=0 Q 12. Écrire la fonction produit_matriciel (A,B), qui reçoit en paramètres deux matrices symétriques A et 8, de même dimension. La fonction calcule et renvoie une nouvelle matrice symétrique C, qui contient le produit matriciel de À et B. La fonction doit économiser le temps de calcul, en calculant une seule fois les coefficients symétriques dans la matrice C. TV. 13- Calcule de la puissance par ‘exponentiation rapide’ Lorsqu'il s'agit d’une matrice carrée, le calcul de la puissance devient crucial. L’exponentiation rapide est un algorithme qui permet de minimiser le nombre de multiplications effectuées dans le calcul de la puissance. Pour calculer x”, le principe de l’exponentiation rapide est le suivant : e Sin=1 alors x"=x e 50 65) pair alors x"=(x")"? Sinestimpair alors x"=x.(x%) 2 Q 13- Écrire la fonction puissance (R, n), reçoit en paramètres la matrice symétrique R représentant un réseau routier, et un entier strictement positif n. En utilisant le principe de l’exponentiation rapide, la fonction calcule et renvoie la matrice R". Page 9 sur 12 نماذج المباريات من موقع وظيفة إنفو wadifa-info.com — صفحة 10 — Épreuve d’Informatique — Session 2019 - Filière PSI Partie V : Base de données et langage SOL Réseau routier pondéré : On associe à chaque route du réseau routier une valeur appelée : poids. Le poids de chaque route est la longueur de cette route, exprimée en km (kilomètre). Ainsi, le réseau routier est appelé : réseau routier pondéré. Exemple : Figure 3 : Réseau routier pondéré par les longueurs des routes en km Le coût d’un chemin : Dans un réseau routier pondéré, le coût d’un chemin est égale à la somme des poids des routes qui composent ce chemin. Exemples : Dans le réseau routier pondéré de la figure 3 : e Lecoût du chemin (1,0, 3, 6) est : 460 = 120+250+90 e Lecoût du chemin (4,6,5,7,3) est : 780 = 120+200+200+260 e Lecoût du chemin (0,1,2,3, 4,5, 6,7) est: 1040 = 120+100+140+150+150+200+180 Dans cette partie, on propose de manipuler le réseau routier pondéré par une base de données composée de deux tables : la table : Villes et la table : Chemins. Villes code (entier) Chemins chemin (texte) nom (texte) nb_routes (entier) couleur (entier) cout (réel) ville depart (entier) ville_arrivee (entier) Page 10 sur 12 نماذج المباريات من موقع وظيفة إنفو wadifa-info.com — صفحة 11 — Épreuve d’Informatique — Session 2019 - Filière PSI Structure de la table ‘Villes’ : La table Villes contient les villes du réseau routier. Le champ code contient les entiers : 0, 1, 2, 3, …, N-1, sachant que n est le nombre de villes dans le réseau routier. Chaque entier représente une seule ville du réseau routier. Le champ nom contient les noms des villes ; Le champ couleur contient des entiers strictement positifs, qui représentent les couleurs des villes. Exemples d'enregistrements dans les tables ‘Villes’ : code | nom Agadir couleur Essaouira Marrakech Ouarzazate Safi Tanger O|S|OUIN|F|O Structure de la table ‘Chemins’ : La table Chemins est composée de 5 champs : Le champ chemin contient tous les chemins simples qui existent entres les villes du réseau routier. Chaque chemin est représenté par une chaîne de caractères, qui contient les villes du chemin, séparées par le caractère '-" (tiré de 6). Exemple : La chaîne '1-0-3-61 représente le chemin (1,0, 3, 6) Le champ nb_routes contient le nombre de routes dans chaque chemin ; Le champ cout contient les coûts des chemins ; Le champ ville_depart contient le code de la ville de départ de chaque chemin ; Le champ ville_arrivee contient le code de la ville d'arrivée de chaque chemin. Exemples d'enregistrements dans la table ‘Chemins’ : chemin | nb_routes | cout ville_depart | ville_arrivee WDJ|OJ|JS|OJO|N|FJOJH Page 11 sur 12 نماذج المباريات من موقع وظيفة إنفو wadifa-info.com — صفحة 12 — Épreuve d’Informatique — Session 2019 - Filière PSI V. 14- Déterminer les clés primaires et les clés étrangères dans les tables Villes et Chemins. Justifier votre réponse. V. 15- Écrire, en algèbre relationnelle, la requête qui donne le résultat suivant : Les codes et noms des villes ayant la couleur 1 ou la couleur 2 dans le réseau routier. Écrire, en langage SQL, les requêtes qui donne les résultats suivants : V. 16- Le nombre de routes dans le réseau routier. V. 17- Le nombre chromatique du réseau routier. V. 18- Les noms des villes et le degré de chaque ville, ayant le degré compris strictement entre 4 et 9, triés dans l’ordre décroissant des degrés. V. 19- Modifier les coûts de tous les chemins qui passent par la route "0-1", en ajoutant la valeur 50 à chacun de ces chemins. V. 20- Le plus petit coût des chemins qui passent par toutes les villes du réseau routier. Page 12 sur 12 نماذج المباريات من موقع وظيفة إنفو wadifa-info.com
✅ التصحيح المقترح
هذا تصحيح مقترح من إعداد فريق wadifa-info لمساعدتك على فهم منهجية الإجابة — وليس تصحيحاً رسمياً صادراً عن الإدارة المنظِّمة. أسئلة هذا الامتحان محررة بالفرنسية، لذلك التصحيح محرر بالفرنسية أيضاً.
Ce sujet est l'épreuve d'Informatique du Concours National Commun (CNC), session 2019, filière PSI, pour l'accès aux écoles d'ingénieurs marocaines. Le sujet fait 12 pages ; sa durée n'est pas indiquée sur les pages scannées. C'est une épreuve d'exercices et problème en Python et SQL. Elle comprend un exercice noté 4 points (factorielle et complexité) et un problème « Réseau routier » en cinq parties. La partie I traite de la matrice d'adjacence et des degrés, la partie II de la coloration gloutonne. La partie III porte sur les chemins et les plus courts chemins, et la partie IV sur le nombre de chemins par puissance de matrice (exponentiation rapide). La partie V est une base de données interrogée en SQL. Voici une correction méthodologique proposée.
💡 Avant de commencer : tout le problème tourne autour de la matrice d'adjacence R du graphe de la figure 2, qui a 8 villes et 15 routes. Écrivez d'abord les petites fonctions de la partie I (list_voisines, degre) : elles sont réutilisées partout ensuite. Les fonctions ci-dessous ont été testées sur les exemples du sujet. On retrouve l'ordre des villes [3, 4, 2, 6, 0, 5, 1, 7], les couleurs C = [2, 1, 3, 1, 2, 1, 3, 2], R2[1][7] = 0 et R3[1][7] = 5.
Exercice : somme et factoriel (4 points)
Q1. factoriel(k)
def factoriel(k):
f = 1
for i in range(2, k + 1):
f = f * i
return f
On a factoriel(0) = 1, car la boucle ne s'exécute pas, et factoriel(5) = 120.
Q2. Complexité de factoriel(k)
La boucle fait k − 1 itérations, chacune avec une multiplication et une affectation de coût constant. La complexité est donc O(k), linéaire en k, si l'on compte les multiplications comme des opérations élémentaires.
Q3. som_fact(L)
def som_fact(L):
s = 0
for x in L:
s = s + factoriel(x)
return s
Pour L = [5, 3, 0, 6, 1], on obtient 120 + 6 + 1 + 720 + 1 = 848.
Q4. Complexité de som_fact(L)
Chaque appel factoriel(x) coûte O(x). Le total vaut O(n + Σ x) ≤ O(n·m), où n = len(L) et m = max(L).
On peut améliorer en triant L, ou en calculant les factorielles de proche en proche jusqu'à m et en les mémorisant. On obtient alors O(n + m), ou O(n log n + m) avec le tri.
Partie I : modélisation d'un réseau routier
Q1. Évaluation d'expressions
- R[4][2] = 1 : les villes 4 et 2 sont reliées.
- R[1] = [1, 0, 1, 0, 1, 0, 0, 0]
- len(R[2]) = 8
- len(R) = 8
Q2.a. voisines(i, j, R)
def voisines(i, j, R):
return R[i][j] == 1
Q2.b. list_voisines(i, R)
def list_voisines(i, R):
return [j for j in range(len(R)) if R[i][j] == 1]
On vérifie que list_voisines(3, R) = [0, 2, 4, 6, 7].
Q3. degre(i, R)
def degre(i, R):
d = 0
for j in range(len(R)):
d = d + R[i][j]
return d
Le degré est la somme de la ligne i. On retrouve degre(3, R) = 5, degre(0, R) = 3 et degre(2, R) = 4.
Q4. liste_degres(R)
def liste_degres(R):
return [(i, degre(i, R)) for i in range(len(R))]
Q5.a. tri_degres(D), ordre décroissant des degrés
On utilise un tri par échanges : on compare la case i à toutes les cases suivantes et on échange dès qu'un degré est plus grand. Ce tri reproduit exactement l'ordre de l'exemple, y compris entre villes de même degré.
def tri_degres(D):
n = len(D)
for i in range(n - 1):
for j in range(i + 1, n):
if D[j][1] > D[i][1]:
D[i], D[j] = D[j], D[i]
return D
On obtient [(3,5), (4,5), (2,4), (6,4), (0,3), (5,3), (1,3), (7,3)]. La complexité est O(n2). Un tri fusion en O(n log n) serait accepté aussi : il ordonne autrement les villes de même degré, ce qui ne change pas le résultat de la coloration sur cet exemple.
Q5.b. tri_villes(R)
def tri_villes(R):
return [v for (v, d) in tri_degres(liste_degres(R))]
Le résultat est [3, 4, 2, 6, 0, 5, 1, 7].
Partie II : coloration des villes (algorithme glouton)
Q6. premier_entier(L)
Les couleurs sont des entiers strictement positifs. D'après l'exemple, qui donne 2 pour [0, 0, 3, 1, 0, 1, 0, 0], on cherche le plus petit entier ≥ 1 absent de L.
def premier_entier(L):
k = 1
while k in L:
k = k + 1
return k
Q7. couleurs_voisines(k, C, R)
def couleurs_voisines(k, C, R):
return [C[i] for i in list_voisines(k, R)]
Exemple : couleurs_voisines(6, [0,0,3,1,2,0,0,0], R) donne [1, 2, 0, 0], car les voisines de 6 sont 3, 4, 5 et 7.
Q8. couleurs_villes(R)
def couleurs_villes(R):
C = [0] * len(R)
for k in tri_villes(R):
C[k] = premier_entier(couleurs_voisines(k, C, R))
return C
Déroulement sur la figure 2, dans l'ordre 3, 4, 2, 6, 0, 5, 1, 7 : la ville 3 prend la couleur 1, puis 4 prend 2, 2 prend 3, 6 prend 3, 0 prend 2, 5 prend 1, 1 prend 1 et 7 prend 2. On obtient C = [2, 1, 3, 1, 2, 1, 3, 2].
Le triangle 0-1-2 impose au moins 3 couleurs, donc 3 est bien le nombre chromatique ici. Attention : en général, l'algorithme glouton (de type Welsh-Powell) donne une borne supérieure du nombre chromatique, pas toujours le minimum.
Partie III : chemins dans un réseau routier
Q9. chemin_valide(T, R)
def chemin_valide(T, R):
if len(T) < 2:
return False
for i in range(len(T) - 1):
if R[T[i]][T[i+1]] != 1:
return False
return True
Pour (3, 1, 4, 7), R[3][1] = 0, donc la fonction renvoie False. On peut ajouter un test 0 ≤ T[i] < len(R) si le tuple peut contenir des numéros invalides.
Q10. chemin_simple(T, R)
def chemin_simple(T, R):
if not chemin_valide(T, R):
return False
for i in range(len(T)):
for j in range(i + 1, len(T)):
if T[i] == T[j]:
return False
return True
La double boucle coûte O(len(T)2). On peut écrire plus court len(set(T)) == len(T), en O(len(T)).
Q11. pc_chemins(i, j, R)
On utilise liste_chemins(i, j, R), qui est fournie. Le plus court chemin est celui qui traverse le moins de villes : on garde tous les chemins de longueur minimale.
def pc_chemins(i, j, R):
L = liste_chemins(i, j, R)
m = min([len(t) for t in L])
return [t for t in L if len(t) == m]
On obtient pc_chemins(0, 7, R) = [(0, 3, 7)]. Pour pc_chemins(7, 1, R), on obtient les 5 chemins à 3 routes de l'énoncé. Un parcours en largeur trouverait la distance sans énumérer tous les chemins simples, dont le nombre peut être exponentiel.
Partie IV : nombre de chemins entre deux villes
Le coefficient (Rp)[i][j] compte les suites de p routes allant de i à j. Cela se démontre par récurrence, car (Rp+1)[i][j] = Σk (Rp)[i][k]·R[k][j].
Q12. produit_matriciel(A, B)
On ne calcule que les coefficients C[i][j] pour j ≥ i, puis on recopie C[j][i] = C[i][j]. Cela divise presque par deux le nombre de coefficients calculés.
def produit_matriciel(A, B):
n = len(A)
C = zeros((n, n), int)
for i in range(n):
for j in range(i, n):
s = 0
for k in range(n):
s = s + A[i][k] * B[k][j]
C[i][j] = s
C[j][i] = s
return C
Remarque à signaler sur la copie : le produit de deux matrices symétriques n'est pas symétrique en général, puisque (AB)T = BA. Il l'est ici parce qu'on ne multiplie que des puissances de R, qui commutent entre elles. La complexité est d'environ n3/2 multiplications, soit O(n3).
Q13. puissance(R, n) par exponentiation rapide
def puissance(R, n):
if n == 1:
return R
P = puissance(produit_matriciel(R, R), n // 2)
if n % 2 == 0:
return P
return produit_matriciel(R, P)
Pour n impair, n // 2 = (n − 1)/2, ce qui donne R·(R2)(n−1)/2. Le nombre de produits est O(log n), au lieu de n − 1 produits par la méthode naïve. Le coût total est O(N3 log n) pour N villes. On retrouve R2[1][7] = 0 et R3[1][7] = 5.
Partie V : base de données et SQL
V.14. Clés primaires et étrangères
- Villes : la clé primaire est code. Chaque entier de 0 à n − 1 désigne une seule ville, alors que nom et couleur ne sont pas garantis uniques : plusieurs villes partagent la même couleur. La table n'a pas de clé étrangère.
- Chemins : la clé primaire est chemin. La chaîne décrit entièrement la suite de villes, donc deux lignes distinctes ont des chaînes distinctes : '0-1' et '1-0' sont deux enregistrements différents. Aucun autre champ n'est unique, car plusieurs chemins ont le même coût, le même départ ou la même arrivée.
- Clés étrangères de Chemins : ville_depart et ville_arrivee référencent toutes deux Villes(code).
V.15. Algèbre relationnelle : villes de couleur 1 ou 2
πcode, nom( σcouleur = 1 ∨ couleur = 2(Villes) )
On peut aussi écrire πcode,nom(σcouleur=1(Villes)) ∪ πcode,nom(σcouleur=2(Villes)).
V.16. Nombre de routes
Une route est un chemin à 1 route. Chaque route figure deux fois dans la table, dans les deux sens ('0-1' et '1-0'). On ne compte donc qu'un seul sens :
SELECT COUNT(*) FROM Chemins
WHERE nb_routes = 1 AND ville_depart < ville_arrivee;
Sur la figure 3, le résultat est 15.
V.17. Nombre chromatique
SELECT COUNT(DISTINCT couleur) FROM Villes;
Cette requête compte les couleurs utilisées. Elle ne donne le nombre chromatique que si la coloration stockée est optimale, ce que suppose l'énoncé. Avec des couleurs numérotées 1, 2, …, k sans trou, SELECT MAX(couleur) FROM Villes donne le même résultat.
V.18. Villes de degré strictement compris entre 4 et 9
SELECT V.nom, COUNT(*) AS degre
FROM Villes V JOIN Chemins C ON V.code = C.ville_depart
WHERE C.nb_routes = 1
GROUP BY V.code, V.nom
HAVING COUNT(*) > 4 AND COUNT(*) < 9
ORDER BY degre DESC;
Le degré d'une ville est le nombre de chemins à une route qui partent d'elle.
V.19. Ajouter 50 au coût des chemins passant par la route 0-1
Il faut repérer les villes consécutives 0 puis 1, ou 1 puis 0. On encadre la chaîne de tirets pour ne pas confondre avec '10-1' ou '0-12' quand il y a plus de 10 villes :
UPDATE Chemins
SET cout = cout + 50
WHERE '-' || chemin || '-' LIKE '%-0-1-%'
OR '-' || chemin || '-' LIKE '%-1-0-%';
V.20. Plus petit coût d'un chemin passant par toutes les villes
Un chemin simple qui passe par les n villes compte exactement n − 1 routes : c'est un chemin hamiltonien.
SELECT MIN(cout) FROM Chemins
WHERE nb_routes = (SELECT COUNT(*) FROM Villes) - 1;
💡 À réviser pour l'informatique du CNC PSI : complexité des boucles simples et imbriquées (savoir la justifier en comptant les itérations) ; graphes représentés par une matrice d'adjacence (voisins, degrés, chemins, sens combinatoire de Rp) ; algorithmes gloutons et leurs limites ; tris simples et tri en O(n log n) ; exponentiation rapide, récursive et itérative ; numpy (array, zeros, indices) ; SQL (clés primaires et étrangères avec justification, algèbre relationnelle, jointure + GROUP BY / HAVING, sous-requête scalaire, UPDATE avec LIKE et concaténation ||). Testez chaque fonction sur les exemples de l'énoncé : ils sont faits pour cela.
أسئلة شائعة حول هذا النموذج
هل يمكن تحميل هذا النموذج مجاناً؟
هل يتضمن هذا النموذج التصحيح؟
ما هي الجهة المنظمة والدرجة المعنية بهذا النموذج؟
ما هي دورة هذا الامتحان ولغة أسئلته؟
أين أجد نماذج أخرى لنفس المباراة؟
💬 ناقش هذا النموذج (0)
شارك إجاباتك أو صحّح التصحيح — إذا كان لديك رأي مختلف حول أي نقطة، اكتبه هنا ليستفيد باقي المترشحين.
لا يوجد نقاش بعد — شارك إجابتك أو سؤالك حول هذا النموذج.
⚠️ ممنوع نشر أرقام الهاتف أو الروابط أو أي عرض مقابل مال — تُحذف هذه المشاركات تلقائياً.
هل تحضّر لهذه المباراة؟
نماذج مشابهة قد تهمّك
المصدر: مباريات ولوج المدارس والمعاهد العليا
📎 كيف تستشهد بهذه الصفحة؟
صحفي أو مدوّن أو أستاذ؟ انسخ المرجع أسفله وضع رابطاً نحو هذه الصفحة.
الرابط الدائم: https://www.wadifa-info.com/نموذج-مباراة/1746/نموذج-المباراة-الوطنية-المشتركة-CNC-2019-المعلوميات-شعبة-PSI-لولوج-مدارس-المهندس
