{
  "chapter": {
    "id": "algorithmes-gloutons",
    "level": "premiere",
    "theme": "Algorithmique",
    "title": "Algorithmes gloutons",
    "description": "Principe des algorithmes gloutons, notion de choix\nlocalement optimal, exemples classiques (rendu de\nmonnaie, sac à dos fractionnaire, sélection\nd'activités), cas où l'algorithme glouton donne\nl'optimum, et contre-exemples qui montrent ses\nlimites.",
    "prerequisites": [],
    "references": []
  },
  "questions": [
    {
      "id": "q01",
      "difficulty": 1,
      "skills": [
        "definition"
      ],
      "title": "Définition d'un algorithme glouton",
      "statement": "Quel est le principe d'un **algorithme glouton** ?",
      "options": [
        {
          "text": "Il choisit toujours au hasard parmi les options disponibles",
          "correct": false,
          "feedback": "Un algorithme glouton est **déterministe** : à\nchaque étape, il applique un critère précis\n(« le plus grand », « le plus court », etc.)\nplutôt qu'un tirage aléatoire.\n"
        },
        {
          "text": "Il essaie chaque possibilité, abandonne quand la solution échoue, puis revient en arrière pour explorer une autre voie",
          "correct": false,
          "feedback": "Cette description correspond à la stratégie de\n**retour sur trace**. Un algorithme glouton, au\ncontraire, ne revient jamais sur ses choix, et\nc'est précisément ce qui le caractérise.\n"
        },
        {
          "text": "À chaque étape, il fait le choix qui semble localement le meilleur, sans jamais revenir en arrière",
          "correct": true,
          "feedback": "C'est exactement cela : un algorithme glouton\nprend une décision irrévocable à chaque étape,\nen espérant que la succession des choix locaux\nmène à un optimum global.\n"
        },
        {
          "text": "Il essaie toutes les solutions possibles, puis garde la meilleure",
          "correct": false,
          "feedback": "Cette description correspond à la **recherche\nexhaustive**, et non à la stratégie gloutonne.\nUn algorithme glouton ne teste qu'une seule\nsolution, en construisant son choix étape par\nétape.\n"
        }
      ],
      "explanation": "Un algorithme glouton est rapide et simple à\nécrire, mais il ne garantit pas l'optimum sur\ntous les problèmes. Il faut une propriété\nmathématique appelée **propriété de choix\nglouton** pour qu'il fonctionne effectivement."
    },
    {
      "id": "q02",
      "difficulty": 1,
      "skills": [
        "exemple",
        "monnaie"
      ],
      "title": "Exemple classique",
      "statement": "Lequel des problèmes suivants est résolu\nnaturellement par un algorithme glouton, dans le\nsystème monétaire de l'euro ?",
      "options": [
        {
          "text": "Calculer la racine carrée d'un nombre",
          "correct": false,
          "feedback": "Le calcul d'une racine carrée n'est pas un\nproblème d'optimisation : on cherche une\nvaleur, pas le meilleur choix parmi\nplusieurs.\n"
        },
        {
          "text": "Trier une liste d'entiers",
          "correct": false,
          "feedback": "Le tri n'est pas un problème d'optimisation\ngloutonne classique. Les algorithmes de tri\nétudiés en classe (tri par insertion, tri par\nsélection) ne sont pas considérés comme des\nalgorithmes gloutons.\n"
        },
        {
          "text": "Le rendu de monnaie, qui consiste à donner le minimum de pièces pour atteindre un montant",
          "correct": true,
          "feedback": "À chaque étape, on prend la plus grande pièce\nqui tient encore dans le reste à rendre. Avec\nle système euro, cette stratégie donne bien le\nnombre minimum de pièces.\n"
        },
        {
          "text": "Vérifier si une chaîne de caractères est un palindrome",
          "correct": false,
          "feedback": "Tester si une chaîne est un palindrome relève\nd'un problème de comparaison, pas\nd'optimisation. Aucun choix successif n'est\nfait.\n"
        }
      ],
      "explanation": "Le rendu de monnaie est l'exemple emblématique\ndes algorithmes gloutons enseignés en classe. Il\nfonctionne bien pour le système euro, mais peut\néchouer pour d'autres systèmes monétaires, comme\nle montre la question suivante."
    },
    {
      "id": "q03",
      "difficulty": 1,
      "skills": [
        "contre-exemple",
        "monnaie"
      ],
      "title": "Contre-exemple du rendu de monnaie",
      "statement": "Avec le système hypothétique de pièces\n$\\{1, 3, 4\\}$, on veut rendre $6$. Que donne\nl'algorithme glouton qui prend la plus grande\npièce possible à chaque étape ?",
      "options": [
        {
          "text": "L'algorithme glouton ne termine pas",
          "correct": false,
          "feedback": "Un algorithme glouton termine toujours en un\nnombre fini d'étapes, car le reste à rendre\ndiminue strictement à chaque étape jusqu'à\natteindre zéro.\n"
        },
        {
          "text": "$4 + 1 + 1 = 6$, soit trois pièces",
          "correct": true,
          "feedback": "L'algorithme glouton commence par prendre la\npièce de $4$, puis deux pièces de $1$, ce qui\nfait trois pièces au total. Or, l'optimum\nréel est $3 + 3 = 6$, soit deux pièces\nseulement. L'algorithme glouton n'a donc pas\ntrouvé la meilleure solution.\n"
        },
        {
          "text": "$3 + 3 = 6$, soit deux pièces",
          "correct": false,
          "feedback": "C'est bien la solution **optimale**, mais\nl'algorithme glouton naïf ne la trouve pas.\nIl commence par prendre la plus grande pièce\nqui tient (la pièce de $4$) plutôt que de\nchercher une combinaison plus astucieuse.\n"
        },
        {
          "text": "$1 + 1 + 1 + 1 + 1 + 1 = 6$, soit six pièces",
          "correct": false,
          "feedback": "Un algorithme glouton ne prend pas\nsystématiquement la plus petite pièce, mais la\nplus grande qui tient encore dans le reste à\nrendre.\n"
        }
      ],
      "explanation": "Cet exemple illustre la limite des algorithmes\ngloutons : ils ne garantissent pas l'optimum sur\ntous les systèmes monétaires. Le système euro\nest conçu de telle sorte que la stratégie\ngloutonne donne toujours le minimum de pièces,\nmais ce n'est pas une propriété universelle."
    },
    {
      "id": "q04",
      "difficulty": 1,
      "skills": [
        "proprietes"
      ],
      "title": "Caractéristiques d'un algorithme glouton",
      "statement": "Lequel des énoncés suivants est **vrai** pour les\nalgorithmes gloutons ?",
      "options": [
        {
          "text": "Ils sont en général rapides, mais ne garantissent pas l'optimum global",
          "correct": true,
          "feedback": "C'est précisément le compromis qui caractérise\nles algorithmes gloutons. Leur rapidité\n(typiquement linéaire ou quasi-linéaire) en\nfait un excellent premier essai, mais il faut\nvérifier ensuite qu'ils donnent l'optimum sur\nle problème considéré.\n"
        },
        {
          "text": "Ils essaient toutes les solutions avant de choisir la meilleure",
          "correct": false,
          "feedback": "C'est la description de la recherche\nexhaustive. Un algorithme glouton ne construit\nqu'une seule solution, sans énumérer les\nalternatives.\n"
        },
        {
          "text": "Ils ont toujours une complexité exponentielle",
          "correct": false,
          "feedback": "C'est plutôt la recherche exhaustive qui a\nsouvent une complexité exponentielle. Les\nalgorithmes gloutons sont au contraire connus\npour leur rapidité.\n"
        },
        {
          "text": "Ils ne fonctionnent que sur les listes triées",
          "correct": false,
          "feedback": "Aucune contrainte n'est imposée sur la nature\ndes données d'entrée. De nombreux algorithmes\ngloutons commencent simplement par un tri,\nmais ce n'est pas une exigence générale.\n"
        }
      ],
      "explanation": "Les principaux avantages des algorithmes\ngloutons sont leur simplicité et leur rapidité.\nLeur principal inconvénient est qu'ils ne sont\npas toujours optimaux. Ils constituent\nnéanmoins un bon premier réflexe à essayer face\nà un problème d'optimisation."
    },
    {
      "id": "q05",
      "difficulty": 1,
      "skills": [
        "strategie"
      ],
      "title": "Critère de choix glouton",
      "statement": "Pour résoudre un problème d'optimisation par un\nalgorithme glouton, quelle question doit-on se\nposer en premier ?",
      "options": [
        {
          "text": "Quelle est la taille du problème ?",
          "correct": false,
          "feedback": "La taille du problème influence la\nperformance, mais elle n'a aucune incidence\nsur la conception même de l'algorithme\nglouton.\n"
        },
        {
          "text": "Quel critère local utiliser pour décider à chaque étape ?",
          "correct": true,
          "feedback": "La conception d'un algorithme glouton commence\ntoujours par le choix d'un critère local :\nprendre la plus grande pièce, le plus court\nchemin, l'objet de plus grande valeur, et\nainsi de suite. Ce choix détermine entièrement\nl'algorithme.\n"
        },
        {
          "text": "Combien de cœurs possède le processeur ?",
          "correct": false,
          "feedback": "Le nombre de cœurs concerne le matériel et\nn'a aucun rapport avec la stratégie\nalgorithmique adoptée.\n"
        },
        {
          "text": "Quel est le langage de programmation utilisé ?",
          "correct": false,
          "feedback": "Le langage de programmation n'a aucune\ninfluence sur la stratégie algorithmique. Un\nalgorithme glouton se conçoit indépendamment\nde Python, Java ou tout autre langage.\n"
        }
      ],
      "explanation": "Une bonne pratique consiste à tester plusieurs\ncritères de choix sur des exemples connus, puis,\nlorsque c'est possible, à démontrer\nmathématiquement que le critère retenu mène à\nl'optimum."
    },
    {
      "id": "q06",
      "difficulty": 1,
      "skills": [
        "exemple",
        "classement"
      ],
      "title": "Sélection d'activités",
      "statement": "On dispose de $n$ activités, chacune définie par\nune heure de début et une heure de fin. On\nsouhaite sélectionner le plus grand nombre\npossible d'activités sans chevauchement. Quel\ncritère glouton donne la solution optimale ?",
      "options": [
        {
          "text": "Choisir l'activité qui commence le plus tôt",
          "correct": false,
          "feedback": "Une activité qui commence tôt peut malgré\ntout durer très longtemps, et donc bloquer le\nplanning pour une grande partie de la\njournée. Ce critère est sous-optimal.\n"
        },
        {
          "text": "Choisir une activité au hasard",
          "correct": false,
          "feedback": "Sans critère défini, l'algorithme n'est plus\nun algorithme glouton, et il n'y a aucune\ngarantie d'optimalité.\n"
        },
        {
          "text": "Choisir l'activité qui finit le plus tôt parmi celles compatibles avec les choix précédents",
          "correct": true,
          "feedback": "Terminer tôt libère le créneau pour de\nnouvelles activités. Ce critère est\nmathématiquement prouvé optimal pour ce\nproblème.\n"
        },
        {
          "text": "Choisir l'activité qui dure le plus longtemps",
          "correct": false,
          "feedback": "Une activité longue bloque le créneau pendant\nun temps important, empêchant d'en placer\nd'autres ensuite. Ce critère conduit donc à\nun mauvais choix.\n"
        }
      ],
      "explanation": "Ce problème, parfois appelé « ordonnancement\nd'intervalles », est un cas d'école où\nl'algorithme glouton trouve l'optimum, à\ncondition de choisir le bon critère (« finir tôt »).\nOn peut s'en convaincre en testant le\nprogramme sur de nombreux cas et en le comparant\nà une recherche exhaustive : la démonstration\nformelle relève de l'enseignement supérieur."
    },
    {
      "id": "q07",
      "difficulty": 1,
      "skills": [
        "pas-de-retour"
      ],
      "title": "Pas de retour en arrière",
      "statement": "Quelle propriété distingue un algorithme glouton\ndes autres stratégies algorithmiques ?",
      "options": [
        {
          "text": "Il essaie toutes les solutions possibles avant de répondre",
          "correct": false,
          "feedback": "C'est la description de la recherche\nexhaustive. L'algorithme glouton fait\nprécisément l'inverse : il prend une seule\ndécision à chaque étape, sans rien essayer\nd'autre.\n"
        },
        {
          "text": "Il ne fonctionne que sur des listes triées",
          "correct": false,
          "feedback": "Aucune contrainte n'est imposée sur la nature\nou l'ordre des données d'entrée.\n"
        },
        {
          "text": "Il fait toujours un choix aléatoire à chaque étape",
          "correct": false,
          "feedback": "Un algorithme glouton est **déterministe** :\nil applique un critère précis pour faire son\nchoix, et non un tirage aléatoire.\n"
        },
        {
          "text": "Il ne revient jamais sur ses décisions : un choix fait reste définitif",
          "correct": true,
          "feedback": "C'est la caractéristique majeure d'un\nalgorithme glouton. Cette absence de retour en\narrière garantit sa rapidité, mais peut aussi\nl'empêcher de trouver l'optimum lorsqu'un\nmauvais choix initial bloque la suite.\n"
        }
      ],
      "explanation": "Lorsque l'algorithme glouton donne l'optimum,\nc'est la stratégie la plus économique\n(rapidité, simplicité). Mais dès qu'il faut\nexplorer plusieurs alternatives pour ne pas se\nfaire piéger, il faut recourir à d'autres\ntechniques, étudiées en classe de terminale."
    },
    {
      "id": "q08",
      "difficulty": 1,
      "skills": [
        "complexite"
      ],
      "title": "Complexité d'un algorithme glouton",
      "statement": "Quelle est typiquement la **complexité** d'un\nalgorithme glouton ?",
      "options": [
        {
          "text": "$O(n!)$, factorielle",
          "correct": false,
          "feedback": "Une complexité factorielle correspond à\nl'énumération de toutes les permutations,\nc'est-à-dire à la recherche exhaustive. Un\nalgorithme glouton fait précisément\nl'inverse.\n"
        },
        {
          "text": "Polynomiale, le plus souvent linéaire ou quasi-linéaire, c'est-à-dire $O(n)$ ou $O(n \\log n)$",
          "correct": true,
          "feedback": "Un algorithme glouton parcourt typiquement\nles éléments une seule fois (complexité\nlinéaire), ou les trie au préalable\n(complexité $O(n \\log n)$). Cette rapidité\nest l'un de ses principaux atouts.\n"
        },
        {
          "text": "Exponentielle",
          "correct": false,
          "feedback": "Une complexité exponentielle correspond\nplutôt à la recherche exhaustive. Un\nalgorithme glouton est au contraire connu\npour sa rapidité.\n"
        },
        {
          "text": "Indéfinie selon les cas",
          "correct": false,
          "feedback": "La complexité est parfaitement définie pour\nchaque algorithme glouton concret : elle\ndépend de la structure du problème et du\ncritère choisi.\n"
        }
      ],
      "explanation": "Cette rapidité fait des algorithmes gloutons\nd'excellents premiers candidats. Si l'on doute\nde leur optimalité, on peut les comparer à une\nsolution exacte sur de petits exemples, ou\nchercher un contre-exemple."
    },
    {
      "id": "q09",
      "difficulty": 1,
      "skills": [
        "code"
      ],
      "title": "Algorithme glouton de rendu de monnaie en Python",
      "statement": "Voici le squelette d'un algorithme glouton de\nrendu de monnaie :\n\n```\ndef rendu(montant, pieces):\n    pieces = sorted(pieces, reverse=True)\n    resultat = []\n    for p in pieces:\n        while montant >= p:\n            resultat.append(p)\n            montant -= p\n    return resultat\n```\n\nQue fait l'instruction\n`pieces = sorted(pieces, reverse=True)` ?",
      "options": [
        {
          "text": "Elle compte le nombre de pièces",
          "correct": false,
          "feedback": "La fonction `sorted` ne compte pas, elle\ntrie. Pour compter les éléments d'une liste,\non utilise plutôt la fonction native `len`.\n"
        },
        {
          "text": "Elle trie les pièces par ordre décroissant, pour traiter d'abord les plus grandes",
          "correct": true,
          "feedback": "Ce tri est cohérent avec la stratégie\ngloutonne du rendu de monnaie. À chaque\nétape, l'algorithme prend la plus grande\npièce qui tient encore dans le reste à\nrendre.\n"
        },
        {
          "text": "Elle mélange les pièces de manière aléatoire",
          "correct": false,
          "feedback": "La fonction `sorted` est strictement\ndéterministe : elle trie selon un ordre\nprécis, et ne mélange jamais aléatoirement.\n"
        },
        {
          "text": "Elle trie les pièces par ordre croissant",
          "correct": false,
          "feedback": "L'argument `reverse=True` inverse l'ordre du\ntri. La liste est donc triée par ordre\n**décroissant**, et non croissant.\n"
        }
      ],
      "explanation": "Cette ligne est essentielle. Sans tri préalable,\nl'algorithme parcourrait les pièces dans\nl'ordre de la liste, ce qui ne correspondrait\nplus à la stratégie gloutonne."
    },
    {
      "id": "q10",
      "difficulty": 1,
      "skills": [
        "vocabulaire"
      ],
      "title": "Choix irrévocable",
      "statement": "Une caractéristique fondamentale d'un algorithme\nglouton est que ses choix sont :",
      "options": [
        {
          "text": "Irrévocables : une fois une décision prise, l'algorithme ne revient jamais dessus",
          "correct": true,
          "feedback": "Cette irrévocabilité rend l'algorithme rapide\n(puisqu'il n'y a aucune exploration à mener),\nmais aussi limité : un mauvais choix initial\npeut bloquer la suite et empêcher d'atteindre\nl'optimum.\n"
        },
        {
          "text": "Optimaux globalement par construction",
          "correct": false,
          "feedback": "Un choix glouton est optimal **localement**,\nmais cette optimalité locale n'entraîne pas\nautomatiquement l'optimalité globale. Tout\nl'enjeu est précisément de trouver un\ncritère pour lequel cette implication soit\nvraie.\n"
        },
        {
          "text": "Aléatoires à chaque appel",
          "correct": false,
          "feedback": "Un algorithme glouton est déterministe : il\napplique un critère précis pour faire ses\nchoix, et donne donc toujours le même\nrésultat sur la même entrée.\n"
        },
        {
          "text": "Réversibles à tout moment",
          "correct": false,
          "feedback": "C'est précisément l'inverse. Si l'on\nrevenait en arrière, ce ne serait plus un\nalgorithme glouton mais une recherche\nexhaustive ou un retour sur trace.\n"
        }
      ],
      "explanation": "Le mot « glouton » vient de l'image d'un mangeur\nqui prend immédiatement ce qu'il préfère, sans\nplanification d'ensemble. Cette image traduit\nbien la nature locale et irrévocable des choix\neffectués par l'algorithme."
    },
    {
      "id": "q11",
      "difficulty": 2,
      "skills": [
        "sac-a-dos-fractionnaire"
      ],
      "title": "Sac à dos fractionnaire",
      "statement": "Pour le **sac à dos fractionnaire** (où l'on peut\ncouper les objets en fragments), quel critère\nglouton donne l'optimum ?",
      "options": [
        {
          "text": "Prendre tous les objets disponibles",
          "correct": false,
          "feedback": "Cette stratégie ne tient pas compte de la\ncontrainte de capacité du sac : on ne peut\npas dépasser le poids maximal autorisé.\n"
        },
        {
          "text": "Prendre les objets par ordre décroissant de valeur par unité de poids, c'est-à-dire `valeur / poids`",
          "correct": true,
          "feedback": "Ce critère maximise le profit pour chaque\nunité de poids placée dans le sac. Comme on\npeut couper les objets en fragments, on\nparvient à exploiter parfaitement la\ncapacité du sac.\n"
        },
        {
          "text": "Prendre les objets par ordre décroissant de poids",
          "correct": false,
          "feedback": "Choisir d'abord les objets les plus lourds\nremplirait rapidement le sac avec des objets\npeu rentables, sans optimiser la valeur\ntotale.\n"
        },
        {
          "text": "Prendre les objets par ordre décroissant de valeur totale",
          "correct": false,
          "feedback": "Un objet de grande valeur peut être très\nlourd, au point d'occuper presque tout le\nsac, alors qu'un objet plus modeste pourrait\noffrir plus de valeur par unité de poids.\n"
        }
      ],
      "explanation": "Une remarque importante : l'algorithme glouton\nfonctionne pour le sac à dos\n**fractionnaire**, mais il ne donne pas\ntoujours l'optimum pour le sac à dos $0/1$ (où\nchaque objet est pris entièrement ou pas du\ntout). Le cas $0/1$ relève d'une autre\ntechnique, étudiée en classe de terminale."
    },
    {
      "id": "q12",
      "difficulty": 2,
      "skills": [
        "contre-exemple-sac"
      ],
      "title": "Sac à dos 0/1 et algorithme glouton",
      "statement": "Pour le **sac à dos $0/1$**, où chaque objet est\npris entièrement ou pas du tout, pourquoi\nl'algorithme glouton fondé sur le ratio\nvaleur/poids ne donne-t-il pas toujours\nl'optimum ?",
      "options": [
        {
          "text": "Parce que les objets ne sont pas triés",
          "correct": false,
          "feedback": "On peut tout à fait trier les objets avant\nle parcours. Le problème vient de la nature\ncombinatoire du cas $0/1$, et non de\nl'ordre dans lequel on examine les objets.\n"
        },
        {
          "text": "Parce qu'on ne peut pas couper les objets, et qu'un choix glouton initial peut occuper tout le sac sans laisser de place à une combinaison meilleure",
          "correct": true,
          "feedback": "C'est exactement le piège. Avec des objets\nindivisibles, prendre l'objet au meilleur\nratio peut consommer une part importante de\nla capacité, sans qu'on puisse compléter par\nla combinaison la plus rentable. Une autre\ntechnique est nécessaire pour garantir\nl'optimum.\n"
        },
        {
          "text": "Parce que l'algorithme glouton est trop lent",
          "correct": false,
          "feedback": "La rapidité n'est pas en cause : l'algorithme\nglouton est même plus rapide que les autres\napproches. La difficulté tient bien à\nl'optimalité du résultat, pas au temps de\ncalcul.\n"
        },
        {
          "text": "Parce que l'algorithme manque toujours de mémoire",
          "correct": false,
          "feedback": "La consommation mémoire d'un algorithme\nglouton est très faible. Le problème ne\nvient absolument pas de là.\n"
        }
      ],
      "explanation": "Pour le sac à dos $0/1$, on utilise une autre\ntechnique étudiée en classe de terminale.\nL'algorithme glouton donne souvent une bonne\nsolution approchée, mais sans garantie\nd'optimalité."
    },
    {
      "id": "q13",
      "difficulty": 2,
      "skills": [
        "selection-activites"
      ],
      "title": "Sélection d'activités",
      "statement": "Le problème de la **sélection d'activités**\nconsiste à planifier le maximum d'activités\npossible dans une journée, sachant qu'on ne peut\nen faire qu'une à la fois. Quelle stratégie\ngloutonne donne l'optimum ?",
      "options": [
        {
          "text": "Choisir à chaque étape l'activité dont l'heure de fin est la plus précoce parmi celles encore compatibles",
          "correct": true,
          "feedback": "Ce critère, qui consiste à finir tôt pour\nlibérer le créneau au plus vite, donne\nl'optimum. On peut le constater\nexpérimentalement sur de nombreux exemples :\nla démonstration formelle relève de\nl'enseignement supérieur.\n"
        },
        {
          "text": "Choisir l'activité dont l'heure de début est la plus précoce",
          "correct": false,
          "feedback": "Une activité commençant tôt peut très bien\ndurer toute la journée, et donc bloquer\ntout le planning. Ce critère est\nsous-optimal.\n"
        },
        {
          "text": "Choisir une activité au hasard",
          "correct": false,
          "feedback": "Tirer au hasard ne respecte pas la\ndéfinition d'un algorithme glouton, qui doit\nappliquer un critère déterministe à chaque\nétape.\n"
        },
        {
          "text": "Choisir à chaque étape l'activité la plus courte",
          "correct": false,
          "feedback": "Ce critère paraît intuitif, mais il est\nsous-optimal. On peut facilement construire\nun contre-exemple où une courte activité\nchevauche deux longues activités, qu'elle\nempêche alors de sélectionner.\n"
        }
      ],
      "explanation": "Cet exemple est emblématique : une stratégie\nlocale très simple (« finir tôt ») donne le\nrésultat optimal, sans recourir à un retour sur\ntrace ni à un examen exhaustif des\npossibilités."
    },
    {
      "id": "q14",
      "difficulty": 2,
      "skills": [
        "sac-a-dos-fractionnaire"
      ],
      "title": "Sac à dos fractionnaire",
      "statement": "Dans le **sac à dos fractionnaire** (où l'on\npeut prendre une fraction d'un objet), quel\ncritère glouton donne l'optimum ?",
      "options": [
        {
          "text": "Prendre les objets les plus lourds d'abord",
          "correct": false,
          "feedback": "Ce critère est l'opposé de ce qui est\nrecherché : il sature rapidement le sac\navec des objets encombrants, sans en tirer\nle meilleur parti.\n"
        },
        {
          "text": "Prendre les objets par ordre décroissant de ratio valeur/poids, puis remplir le reste de la capacité avec une fraction de l'objet suivant",
          "correct": true,
          "feedback": "Ce critère maximise la valeur obtenue par\nunité de poids. Pour la version\nfractionnaire, il donne l'optimum exact.\n"
        },
        {
          "text": "Prendre les objets dans l'ordre alphabétique",
          "correct": false,
          "feedback": "L'ordre alphabétique n'a aucun rapport avec\nle poids ni avec la valeur. Aucune raison\nne justifie cette stratégie.\n"
        },
        {
          "text": "Prendre les objets par ordre décroissant de valeur",
          "correct": false,
          "feedback": "Un objet très précieux mais encombrant peut\nse révéler moins intéressant qu'un objet\nplus modeste mais beaucoup plus léger. La\nvaleur seule ne suffit pas comme critère.\n"
        }
      ],
      "explanation": "La différence avec le **sac à dos $0/1$**\n(objets indivisibles) est essentielle. Pour le\ncas $0/1$, l'algorithme glouton ne donne plus\nl'optimum : c'est l'un des pièges classiques\nqui montrent les limites de cette approche."
    },
    {
      "id": "q15",
      "difficulty": 2,
      "skills": [
        "rendu-monnaie-trace"
      ],
      "title": "Trace du rendu de monnaie",
      "statement": "Avec la stratégie gloutonne (« prendre la plus\ngrande pièce ne dépassant pas le reste à\nrendre ») et les pièces $\\{1, 2, 5, 10\\}$, quel\nest le rendu pour la valeur $18$ ?",
      "options": [
        {
          "text": "$10 + 5 + 2 + 1 = 18$, soit quatre pièces",
          "correct": true,
          "feedback": "Le déroulé est le suivant : $18 = 10 + 8$,\npuis $8 = 5 + 3$, puis $3 = 2 + 1$, soit\nquatre pièces au total. C'est aussi\nl'optimum pour ce système monétaire.\n"
        },
        {
          "text": "$5 + 5 + 5 + 2 + 1 = 18$, soit cinq pièces",
          "correct": false,
          "feedback": "L'algorithme glouton ne prend pas plusieurs\npièces de $5$ alors qu'une pièce de $10$ est\ndisponible. Il choisit toujours la plus\ngrande pièce qui tient encore dans le reste\nà rendre.\n"
        },
        {
          "text": "La pièce de $1$ répétée dix-huit fois",
          "correct": false,
          "feedback": "L'algorithme glouton choisit la **plus\ngrande** pièce possible à chaque étape, et\nnon la plus petite. Cette solution serait\nla pire possible.\n"
        },
        {
          "text": "$10 + 10 = 20$",
          "correct": false,
          "feedback": "Cette somme dépasse $18$. L'algorithme\nglouton ne choisit jamais une pièce qui\nexcéderait le reste à rendre.\n"
        }
      ],
      "explanation": "Avec ce système monétaire, l'algorithme glouton\ndonne bien l'optimum. Mais ce n'est pas\ntoujours le cas. Avec le système $\\{1, 3, 4\\}$\npour rendre $6$, l'algorithme glouton donne\n$4 + 1 + 1$, soit trois pièces, alors que\nl'optimum est $3 + 3$, soit deux pièces."
    },
    {
      "id": "q16",
      "difficulty": 2,
      "skills": [
        "propriete-choix"
      ],
      "title": "Propriété de choix glouton",
      "statement": "Pour qu'un algorithme glouton donne l'optimum\nglobal, le problème doit posséder la **propriété\nde choix glouton**. Que signifie-t-elle ?",
      "options": [
        {
          "text": "Il existe un choix local optimal qui peut être étendu en une solution globalement optimale",
          "correct": true,
          "feedback": "Autrement dit, faire le « bon » choix local\nn'empêche jamais d'atteindre l'optimum\nglobal. Démontrer cette propriété est\nessentiel pour valider un algorithme\nglouton.\n"
        },
        {
          "text": "Tous les choix locaux mènent à l'optimum global",
          "correct": false,
          "feedback": "Si tous les choix menaient à l'optimum,\nn'importe quel algorithme fonctionnerait, ce\nqui n'est évidemment pas le cas. La\npropriété est plus subtile : il faut qu'**au\nmoins un** choix local optimal soit\nextensible à une solution globalement\noptimale.\n"
        },
        {
          "text": "Le problème a une solution unique",
          "correct": false,
          "feedback": "L'unicité de la solution n'a aucun rapport\navec la propriété de choix glouton. Un\nproblème peut avoir plusieurs solutions\noptimales et posséder la propriété, ou\ninversement.\n"
        },
        {
          "text": "L'algorithme termine en un nombre fini d'étapes",
          "correct": false,
          "feedback": "La terminaison est une propriété de\nl'algorithme, pas du problème. Elle ne suffit\npas à garantir l'optimalité du résultat.\n"
        }
      ],
      "explanation": "Cette propriété, combinée à la **sous-structure\noptimale** (la solution optimale globale\ncontient les solutions optimales des\nsous-problèmes), garantit que l'algorithme\nglouton fonctionne."
    },
    {
      "id": "q17",
      "difficulty": 2,
      "skills": [
        "code",
        "sort-key"
      ],
      "title": "Tri par critère personnalisé",
      "statement": "Pour trier en Python une liste d'objets par leur\nratio `valeur / poids` décroissant (par exemple\nen préparation d'un sac à dos fractionnaire),\nquelle écriture utilise-t-on ?",
      "options": [
        {
          "text": "`objets.sort(key=lambda o: o.valeur / o.poids, reverse=True)`",
          "correct": true,
          "feedback": "Le paramètre `key` indique la fonction\nservant de clé de comparaison, et\n`reverse=True` inverse l'ordre pour obtenir\nun tri décroissant.\n"
        },
        {
          "text": "`objets.sort()`",
          "correct": false,
          "feedback": "Sans argument, la méthode `sort` trie selon\nl'ordre naturel, qui ne correspond pas au\nratio recherché.\n"
        },
        {
          "text": "`objets = max(objets)`",
          "correct": false,
          "feedback": "La fonction `max` ne trie pas, elle renvoie\nuniquement l'élément le plus grand.\n"
        },
        {
          "text": "`objets.sort(by='ratio')`",
          "correct": false,
          "feedback": "Le paramètre `by` n'existe pas pour la\nméthode `sort` en Python. Cette syntaxe\nressemble plutôt à celle de la\nbibliothèque pandas ou du langage SQL.\n"
        }
      ],
      "explanation": "Cette construction est très courante en Python\npour les algorithmes gloutons : on commence par\ntrier les éléments selon le critère retenu,\npuis on les parcourt linéairement pour\nconstruire la solution."
    },
    {
      "id": "q18",
      "difficulty": 2,
      "skills": [
        "conception"
      ],
      "title": "Méthode pour concevoir un algorithme glouton",
      "statement": "Quelles étapes sont conseillées pour concevoir\nun algorithme glouton sur un nouveau problème ?",
      "options": [
        {
          "text": "Choisir le premier critère qui paraît simple, sans le tester",
          "correct": false,
          "feedback": "La simplicité d'un critère ne garantit pas\nson optimalité. Il est indispensable de le\ntester sur des exemples et, idéalement, de\nle démontrer.\n"
        },
        {
          "text": "Coder en Python, lancer en production, et espérer que cela fonctionne",
          "correct": false,
          "feedback": "Cette approche est dangereuse. Sans\nanalyse préalable, on risque de produire\ndes résultats erronés sur certains cas, et\nde propager le bug en production.\n"
        },
        {
          "text": "Demander directement la solution à l'enseignant",
          "correct": false,
          "feedback": "Cette démarche n'apporte rien sur le plan de\nla formation au raisonnement algorithmique.\nConstruire soi-même la solution est\nprécisément ce qu'on cherche à apprendre.\n"
        },
        {
          "text": "D'abord identifier le critère de choix local, puis tester sur de nombreux exemples (en comparant si possible à une recherche exhaustive), et enfin chercher activement un contre-exemple",
          "correct": true,
          "feedback": "Cette démarche méthodique commence par le\ncritère, vérifie son comportement sur des\ncas concrets, et se termine par la\nrecherche d'un contre-exemple éventuel.\nSans la dernière étape, on dispose d'une\nheuristique sans garantie sur les cas non\ntestés.\n"
        }
      ],
      "explanation": "Cette méthode est aussi celle des chercheurs en\nalgorithmique. Trouver un contre-exemple est\nsouvent rapide et suffit à invalider un mauvais\ncritère ; la démonstration formelle de\nl'optimalité, lorsqu'elle est possible, relève\nde l'enseignement supérieur."
    },
    {
      "id": "q19",
      "difficulty": 2,
      "skills": [
        "comparaison"
      ],
      "title": "Algorithme glouton et recherche exhaustive",
      "statement": "Quel est l'avantage essentiel d'un algorithme\nglouton sur une **recherche exhaustive** ?",
      "options": [
        {
          "text": "Il garantit toujours l'optimum",
          "correct": false,
          "feedback": "C'est l'inverse. La recherche exhaustive\ngarantit toujours l'optimum (si elle se\ntermine), tandis qu'un algorithme glouton\nne le garantit pas en général.\n"
        },
        {
          "text": "Il est bien plus rapide : sa complexité est polynomiale plutôt qu'exponentielle",
          "correct": true,
          "feedback": "Sur des problèmes de taille moyenne ou\ngrande, la différence est colossale. Pour\n$n = 30$, on dépasse $10^9$ opérations en\nrecherche exhaustive, contre quelques\ndizaines à quelques centaines pour un\nalgorithme glouton linéaire.\n"
        },
        {
          "text": "Il est plus simple à expliquer en classe",
          "correct": false,
          "feedback": "La simplicité pédagogique est un avantage\nsecondaire, mais elle n'est pas l'avantage\nprincipal d'un algorithme glouton.\n"
        },
        {
          "text": "Il consomme moins de mémoire",
          "correct": false,
          "feedback": "La consommation mémoire varie selon les\nimplémentations et n'est pas l'avantage\nprincipal mis en avant.\n"
        }
      ],
      "explanation": "C'est cette rapidité qui justifie l'usage d'un\nalgorithme glouton, même quand il ne donne pas\nl'optimum exact. Sur des données massives,\nc'est souvent la seule approche réalisable."
    },
    {
      "id": "q20",
      "difficulty": 2,
      "skills": [
        "approximation"
      ],
      "title": "Algorithme glouton comme approximation",
      "statement": "Lorsque l'algorithme glouton ne donne pas\nl'optimum, peut-on quand même l'utiliser ?",
      "options": [
        {
          "text": "Oui, comme algorithme d'approximation rapide donnant une solution proche de l'optimum",
          "correct": true,
          "feedback": "Pour de nombreux problèmes difficiles,\nl'algorithme glouton donne une solution en\ntemps raisonnable, proche du meilleur\nrésultat connu. Ce compromis entre\nrapidité et qualité est très intéressant en\npratique.\n"
        },
        {
          "text": "Seulement si on retire la contrainte d'optimalité",
          "correct": false,
          "feedback": "Cette formulation est imprécise. On peut\nutiliser l'algorithme glouton comme\napproximation, c'est-à-dire en acceptant\nune qualité moindre que l'optimum, mais\nsans changer la nature du problème.\n"
        },
        {
          "text": "Oui, mais seulement avec un ordinateur quantique",
          "correct": false,
          "feedback": "Les algorithmes gloutons sont des\nalgorithmes classiques qui s'exécutent sur\ndes ordinateurs traditionnels. Ils n'ont\naucun rapport avec l'informatique\nquantique.\n"
        },
        {
          "text": "Non, jamais",
          "correct": false,
          "feedback": "Cette position est trop catégorique. Un\nalgorithme glouton est très souvent utilisé\ncomme **heuristique** ou comme algorithme\nd'approximation rapide, même quand il ne\ngarantit pas l'optimum.\n"
        }
      ],
      "explanation": "Pour le voyageur de commerce, par exemple, un\nalgorithme glouton du type « plus proche\nvoisin » donne souvent une tournée à environ\n$25\\%$ de l'optimum, en temps quadratique.\nC'est un compromis très intéressant en\npratique."
    },
    {
      "id": "q21",
      "difficulty": 3,
      "skills": [
        "contre-exemple",
        "construction"
      ],
      "title": "Construire un contre-exemple",
      "statement": "On vous propose un problème et un algorithme\nglouton. Comment démontrer que cet algorithme ne\ndonne **pas** toujours l'optimum ?",
      "options": [
        {
          "text": "Vérifier que l'algorithme termine",
          "correct": false,
          "feedback": "La terminaison est une propriété\nnécessaire mais non suffisante pour\nconclure quant à l'optimalité. Un\nalgorithme peut terminer rapidement et\nrenvoyer une solution sous-optimale.\n"
        },
        {
          "text": "Démontrer que l'algorithme est lent",
          "correct": false,
          "feedback": "La vitesse de l'algorithme ne dit rien sur\nson optimalité. Un algorithme peut être à\nla fois très rapide et incapable de\ntrouver l'optimum.\n"
        },
        {
          "text": "Trouver un exemple concret où l'algorithme glouton donne une solution strictement moins bonne que l'optimum",
          "correct": true,
          "feedback": "Un seul contre-exemple suffit pour\ninvalider un algorithme glouton. C'est la\nméthode classique de réfutation en\ninformatique : un cas particulier qui\ncontredit l'énoncé général.\n"
        },
        {
          "text": "Compiler le programme dans plusieurs langages différents",
          "correct": false,
          "feedback": "Le langage de programmation utilisé n'a\naucune influence sur l'optimalité du\nrésultat produit par l'algorithme.\n"
        }
      ],
      "explanation": "Un conseil utile : pour les problèmes simples,\nessayez de petits exemples « piégés » avec des\nasymétries, des poids très différents, ou des\nbornes serrées. Un contre-exemple émerge\nsouvent rapidement."
    },
    {
      "id": "q22",
      "difficulty": 3,
      "skills": [
        "analyse"
      ],
      "title": "Algorithme glouton et terminaison",
      "statement": "Pourquoi un algorithme glouton **termine-t-il\ntoujours** en un nombre fini d'étapes ?",
      "options": [
        {
          "text": "Parce qu'il utilise une boucle `while`",
          "correct": false,
          "feedback": "Une boucle `while` peut très bien être\ninfinie. La terminaison ne dépend pas du\ntype de boucle utilisée, mais de\nl'existence d'un variant qui décroît\nstrictement.\n"
        },
        {
          "text": "Parce que la mémoire de l'ordinateur est limitée",
          "correct": false,
          "feedback": "La limite de mémoire peut provoquer une\nerreur d'exécution, mais elle ne garantit\npas la terminaison logique de l'algorithme.\n"
        },
        {
          "text": "Parce qu'à chaque étape, soit l'algorithme prend un élément qui ne sera plus considéré ensuite, soit il s'arrête",
          "correct": true,
          "feedback": "Le nombre d'éléments candidats décroît\nstrictement à chaque étape. Comme c'est un\nentier positif, l'algorithme s'arrête en\nau plus $n$ étapes, où $n$ est le nombre\nd'éléments initiaux.\n"
        },
        {
          "text": "Parce que tous les algorithmes terminent en informatique",
          "correct": false,
          "feedback": "Cette affirmation est fausse en général :\nde nombreux algorithmes peuvent ne pas\nterminer (boucle infinie). Un algorithme\nglouton termine pour une raison précise et\nstructurelle, pas par principe général.\n"
        }
      ],
      "explanation": "C'est l'argument du **variant** : une\nquantité entière positive qui décroît\nstrictement à chaque étape garantit la\nterminaison. Pour un algorithme glouton, le\nvariant est typiquement le nombre d'éléments\ncandidats restants."
    },
    {
      "id": "q23",
      "difficulty": 3,
      "skills": [
        "verification-experimentale"
      ],
      "title": "Vérifier expérimentalement l'optimalité",
      "statement": "On a écrit un algorithme glouton pour un\nnouveau problème d'optimisation. Sans pouvoir\nfaire de démonstration formelle, comment se\ndonner une **bonne confiance** dans le fait\nqu'il donne l'optimum sur les cas pratiques ?",
      "options": [
        {
          "text": "Augmenter la taille du problème pour voir\nsi cela aide\n",
          "correct": false,
          "feedback": "Erreur : tester de plus grandes tailles ne\nrenseigne pas sur l'optimalité, car on n'a\nplus de référence (la recherche exhaustive\ndevient impraticable). Pour gagner en\nconfiance, il faut au contraire tester sur\nde **petites** tailles, où l'on peut\ncomparer à la solution exacte.\n"
        },
        {
          "text": "Lui faire confiance s'il a été trouvé sur\nInternet\n",
          "correct": false,
          "feedback": "Erreur : un algorithme trouvé sur Internet\nn'a aucune garantie d'être optimal pour\nvotre variante du problème. Les conditions\nprécises (système monétaire, nature des\nobjets, etc.) modifient souvent l'optimalité\nd'un critère glouton.\n"
        },
        {
          "text": "Lancer le programme une seule fois sur un\nexemple et conclure\n",
          "correct": false,
          "feedback": "Erreur : un seul exemple ne prouve rien.\nC'est précisément le piège du rendu de\nmonnaie, qui fonctionne sur le système\neuros mais échoue sur d'autres systèmes\nmonétaires.\n"
        },
        {
          "text": "Comparer ses résultats à ceux d'une recherche\nexhaustive sur de nombreux cas de petite\ntaille (où la recherche exhaustive reste\npraticable), et chercher activement des\ncontre-exemples\n",
          "correct": true,
          "feedback": "Bonne réponse : c'est la démarche\nexpérimentale standard. La recherche\nexhaustive (par exemple en énumérant tous\nles sous-ensembles possibles) garantit\nl'optimum mais coûte $O(2^n)$, ce qui la\nrend faisable uniquement pour de petits\n$n$. Si l'algorithme glouton coïncide avec\nla recherche exhaustive sur tous les cas\ntestés, on a une bonne confiance pratique\n(sans pour autant disposer d'une preuve\nformelle).\n"
        }
      ],
      "explanation": "Démarche pédagogique en NSI : tester sur des\ncas concrets, comparer à une référence\n(recherche exhaustive ou solution optimale\nconnue), et chercher des contre-exemples. La\ndémonstration formelle de l'optimalité d'un\nalgorithme glouton (par argument d'échange,\npar exemple) relève de l'enseignement\nsupérieur et n'est pas exigée au lycée."
    },
    {
      "id": "q24",
      "difficulty": 3,
      "skills": [
        "synthese",
        "choix"
      ],
      "title": "Quelle approche essayer en premier ?",
      "statement": "Face à un nouveau problème d'optimisation, quelle\napproche essayer en **premier** ?",
      "options": [
        {
          "text": "Aucune méthode particulière, en essayant plusieurs idées au hasard",
          "correct": false,
          "feedback": "Une démarche désordonnée ne permet pas de\nprogresser méthodiquement vers une\nsolution. Il vaut mieux suivre une approche\nstructurée comme l'algorithme glouton.\n"
        },
        {
          "text": "Une recherche exhaustive systématique, pour être certain d'obtenir l'optimum",
          "correct": false,
          "feedback": "Tester toutes les combinaisons devient\nrapidement impraticable dès que la taille\ndu problème augmente, car le nombre de cas\ncroît de manière exponentielle.\n"
        },
        {
          "text": "Un algorithme glouton simple : il est rapide à coder et à tester ; si l'optimalité est démontrée ou empiriquement bonne, on s'arrête là, sinon on cherche une autre approche",
          "correct": true,
          "feedback": "C'est la démarche pragmatique. Beaucoup de\nproblèmes admettent une solution gloutonne\nsimple. Inutile de chercher une approche\ncompliquée si un algorithme glouton suffit\nà donner l'optimum.\n"
        },
        {
          "text": "Une approche aléatoire, sans stratégie particulière",
          "correct": false,
          "feedback": "Sans démarche structurée, on ne peut rien\napprendre du problème, et on perd toute\ngarantie sur la qualité de la solution\nobtenue.\n"
        }
      ],
      "explanation": "Démarche conseillée : tester d'abord un\nalgorithme glouton simple, vérifier sur des cas\nconnus s'il donne bien l'optimum, et, si un\ncontre-exemple apparaît, chercher une autre\nstratégie ou se contenter d'une approximation."
    },
    {
      "id": "q25",
      "difficulty": 3,
      "skills": [
        "synthese"
      ],
      "title": "Conclusion sur les algorithmes gloutons",
      "statement": "Lequel des énoncés suivants résume le mieux les\nalgorithmes gloutons ?",
      "options": [
        {
          "text": "Ils sont rapides et fonctionnent toujours",
          "correct": false,
          "feedback": "Cette affirmation est trop optimiste. Les\nalgorithmes gloutons sont rapides, mais\nils ne donnent pas toujours l'optimum sur\ntous les problèmes.\n"
        },
        {
          "text": "Ils sont obsolètes et n'ont plus aucun intérêt aujourd'hui",
          "correct": false,
          "feedback": "Les algorithmes gloutons gardent toute leur\npertinence, particulièrement lorsque\nl'optimalité est démontrable ou lorsqu'une\napproximation rapide suffit pour\nl'application visée.\n"
        },
        {
          "text": "Ils utilisent l'intelligence artificielle",
          "correct": false,
          "feedback": "Les algorithmes gloutons sont des\nalgorithmes classiques et déterministes.\nIls n'ont aucun rapport avec l'apprentissage\nautomatique ou l'intelligence\nartificielle.\n"
        },
        {
          "text": "Ils sont rapides et simples ; ils donnent l'optimum sur certains problèmes, et constituent souvent une bonne approximation sur d'autres",
          "correct": true,
          "feedback": "C'est exactement leur place dans le paysage\nalgorithmique : un outil indispensable, mais\nà utiliser avec discernement, en testant\nsystématiquement leur comportement sur des\nexemples avant de leur faire confiance.\n"
        }
      ],
      "explanation": "Maîtriser les algorithmes gloutons, c'est\nsavoir reconnaître les problèmes qui s'y\nprêtent (rendu de monnaie sur certains\nsystèmes, sac à dos fractionnaire, sélection\nd'activités) et savoir détecter ceux qui\ndemandent une autre approche (sac à dos $0/1$,\nvoyageur de commerce)."
    }
  ]
}