Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème d'algorithmie

correction d'algorithme

    21 avril 2024 à 12:23:27

    Bonjour à tous.

    J'essayais de faire ce problème: https://concours.algorea.org/contents/4807-4802-1735320797656206224-103413922876285801/

    Voici son énoncé car il faut faire les deux précédents pour pouvoir le débloquer: 

    Énoncé

    Dans une liste de nombres entiers, une répétition est une paire de nombres égaux qui sont côte à côte. Par exemple, dans la liste 1 3 3 4 2 2 1 1 1, il y a quatre répétitions : les deux 3, puis les deux 2, puis les deux 1 qui suivent, et enfin les deux 1 de la fin de la liste.

    On vous donne une liste de nombres entiers. Écrivez un programme qui calcule le nombre minimum de répétitions qu'il peut rester dans la liste une fois que l'on a retiré toutes les occurrences d'un des nombres.

    Entrée

    La première ligne de l'entrée contient un entier nbNombres, avec 2 ≤ nbNombres ≤ 50 000.

    Les nbNombres lignes suivantes contiennent chacune un entier compris entre 0 et nbNombres.

    Sortie

    Vous devez afficher un nombre : le nombre minimum de répétitions qu'il est possible d'obtenir après avoir supprimé toutes les occurrences d'un des nombres de la liste.

    Exemples

    Voici un exemple d'entrée :

    9
    1
    3
    2
    2
    3
    4
    4
    2
    1
    

    La liste de 9 nombres est "1 3 2 2 3 4 4 2 1". Elle contient deux répétitions (les deux premiers 2 et les deux 4) :

    • retirer les 1 laisse les deux répétitions ;
    • retirer les 2 rapproche les trois, donc on a supprimé une répétition et en rajoute une. Il reste donc deux répétitions ;
    • retirer les 3 laisse les deux répétitions ;
    • retirer les 4 ne laisse qu'une répétition.

    Si on supprime toutes les occurrences du nombre 4, il reste une seule répétition. Il n'est pas possible d'en obtenir moins, donc votre programme doit afficher : 1

    Mon code marche sur plusieurs test mais ne les réussi pas tous, je dois oublier de traiter un cas mais je ne vois pas lequel, voici mon code: 

    #include<bits/stdc++.h>
    using namespace std;
    
    int nombre[50001] = {0};
    int rep[50001] = {0};
    
    int main(){
        int nb;
        cin>>nb;
        cin>>nombre[0];
        int total = 0;
        for (int i=1; i<nb;i++){
            cin>>nombre[i];
            if (nombre[i] == nombre[i-1]){
                rep[nombre[i]] ++;
                total++;
            }
        }
        int a = 1;
        int b = 1;
        while(a<nb){
            if (rep[nombre[a]]>0){
                while(nombre[a] == nombre[b]){
                    b++;
                }
                if (nombre[a-1] == nombre[b]){
                    rep[nombre[a]] --;
                    b--;
                }
            }
            b++;
            a = b;
        }
        int maxi = 0;
        for (int i =0; i<50001;i++){
            if (rep[i]>=maxi){
                maxi= rep[i];
            }
        }
        cout<<total-maxi;
     }

    si vous pouviez éclairer ma lanterne, je serais vraiment très reconnaissant. (je connais aussi Python et C donc si vous avez des solutions dans ces langages, je suis aussi preneur)

    merci beaucoup d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      24 avril 2024 à 17:52:38

      Tu as la possibilité de données les entrées qui ne fonctionnent pas ? 

      et tu es sûr que le problème vient de l'oubli d'un cas et pas d'autre chose ? (quel est le message indiquant l'échec?)

      -
      Edité par umfred 24 avril 2024 à 17:55:26

      • Partager sur Facebook
      • Partager sur Twitter

      problème d'algorithmie

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      • Editeur
      • Markdown