Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problèmes d'étagères sur France IOI

un algorithme dynamique

    21 juin 2024 à 15:45:56

    Bonjour,

    je cale sur cet exo sur France IOI
    Un peu d'aide serait bienvenue

    Les archives du département de police sont stockées dans des étagères, organisées en C colonnes et R rangées

    Pour atteindre un objet sur une étagère, on doit utiliser une échelle. Une échelle peut être posée sur une colonne d'étagères. En la grimpant jusqu'à une certaine hauteur (rangée), il est possible de prendre n'importe-quels objets de la colonne, jusqu'à la hauteur à laquelle on grimpe, ainsi que des objets des colonnes adjacentes (gauche et droite).

    Les policiers ont besoin de prendre certains objets dans les archives. Pour réduire les risques d'accidents du travail, il est nécessaire de trouver une manière de récuperer tous les objets requis, de telle manière que la somme totale de toutes les hauteurs auxquelles on a grimpé soit minimale.

    On vous fournit la description des archives, avec tous les objets qu'elle contient.

    Ecrivez un programme qui détermine la hauteur totale minimale des déplacements nécessaire pour récupérer tous les objets des archives.

    Limites de temps et de mémoire (C++)

    • Temps : 2,5 s sur une machine à 1 GHz.
    • Mémoire : 1 000 ko.

    Contraintes

      • 1 <= C <= 100, où C est le nombre de colonnes des archives

      • 1 <= R <= 100, où R est le nombre de rangées des archives

      • 1 <= ci <= C, où ci est l'indice de la colonne du i-ème objet

    • 1 <= ri <= R, où ri est l'indice de la rangée du i-ème objet

    Entrée

    La première ligne de l'entrée contient deux entiers, C et R, nombre de colonnes et nombre de rangées des archives, séparées par un espace.

    La deuxième ligne de l'entrée contient le nombre d'étagères que l'on doit atteindre.

    Chacune des N lignes suivantes contient deux entiers, le numéro de la colonne, et le numéro de la rangée de l'étagère à atteindre.

    Sortie

    La sortie contient une ligne : la hauteur totale minimale à grimper pour atteindre toutes les étagères données.

    Exemples

    Exemple 1

    entrée :

    5 5
    3
    2 3
    3 4
    4 4

    sortie :

    4

    Exemple 2

    entrée :

    6 20
    4
    5 6
    1 1
    6 1
    3 7

    sortie :

    9

    Exemple 3

    entrée :

    10 10
    5
    9 1
    7 6
    5 8
    4 1
    3 2

    sortie :

    11

     voilà ce que j'ai fait, je passe 4 tests sur 11, et je passe tous les tests donnés en exemple

    //code 5
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <cmath>
    #include <climits>
    const int INF = INT_MAX;
    int main()
    {
      std::ios::sync_with_stdio(false);
      std::cin.tie(nullptr);
      int C, R, N;
      std::cin >> C >> R >> N;
      std::vector<std::pair<int, int>> shelves(N);
      for (int i = 0; i < N; ++i)
      {
        std::cin >> shelves[i].first >> shelves[i].second;
      }
      // Trier les étagères par lignes en ordre décroissant, puis par colonnes en ordre croissant
      sort(shelves.begin(), shelves.end(), [](const std::pair<int, int> &a, const std::pair<int, int> &b) {
        if (a.second != b.second) return a.second > b.second;
        return a.first < b.first;
      });
      int min_total_distance = INF;
      // Commencer par chaque colonne de la première ligne
      for (int start_col = 1; start_col <= C; ++start_col)
      {
        int total_distance = 0;
        int current_col = start_col;
        int current_row = 0;
        for (int i = 0; i < N; )
        {
          int max_height = 0;
          // Collecte des livres dans la colonne actuelle et les colonnes adjacentes tout en grimpant
          while (i < N && (shelves[i].first == current_col || shelves[i].first == current_col - 1 || shelves[i].first == current_col + 1))
          {
            max_height = std::max(max_height, shelves[i].second);
            i++;
          }
          // Calcule la distance verticale jusqu'à la hauteur maximale dans cette étagère
          total_distance += (max_height - current_row);
          current_row = max_height;
          // Passe à la colonne suivante s'il y a plus d'étagères
          if (i < N)
          {
            // Passe horizontalement à la colonne du livre suivant
            //total_distance += std::abs(shelves[i].first - current_col);
            current_col = shelves[i].first;
            // Réinitialise la rangée actuelle à 0 puisque nous devons remonter depuis le sol
            current_row = 0;
          }
        }
        // Mettre à jour la distance totale minimale trouvée
        min_total_distance = std::min(min_total_distance, total_distance);
      }
      std::cout << min_total_distance << "\n";
      return 0;
    }



    • Partager sur Facebook
    • Partager sur Twitter
      21 juin 2024 à 17:03:46

      Il faut montrer les tests qui passent pas, les valeurs utilisés, les erreurs obtenues.
      • Partager sur Facebook
      • Partager sur Twitter
        21 juin 2024 à 17:06:34

        C'est ça qui est pénible avec France-ioi, les jeux de tests ne sont pas accessibles -- faudrait pas que l'on triche et renvoie directement le résultat attendu plutot que de le calculer...

        Nombre de fois où j'ai bidouillé les programmes pour leur faire cracher conditionnellement les inputs pour pouvoir débugguer... C'est infernal.

        • Partager sur Facebook
        • Partager sur Twitter
        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
          21 juin 2024 à 17:48:16

          oui lmghs a raison, pour débugguer c'est compliqué dans la mesure où les données des tests ne sont pas fournies.

          Tout ce que j'ai c'est que sur les exemples fournies le programme donne la bonne réponse, et encore dans cet exo il y a 3 exemples. Pourtant le sujet est intéressant.

          • Partager sur Facebook
          • Partager sur Twitter
            21 juin 2024 à 17:54:57

            C'est juste pas comme ça qu'on travaille. On fait pas des tests sans connaitre leur contenu et pourquoi les tests ne passent pas. Et c'est pas en lisant 50 fois le code qu'on va forcement penser aux tests qui peuvent échouer.

            Donc il faut faire comme lmghs a dit (afficher directement les valeurs de C, N, R) et reproduire les tests localement. Ou écrire tes propres tests, en testant les cas limites auxquelles tu penses.

            • Partager sur Facebook
            • Partager sur Twitter
              21 juin 2024 à 18:58:57

              Si le programme affiche des trucs ça plante les premiers tests.

              Et plus, la quantité de choses affichées véritablement à la fin est filtrée.

              C'est à cause de ça que je n'ai pas persisté au delà de leur niveau 4.

              PS : les bidouillages sur la console ne servent à rien. Ca ne fait pas de différence. Quand les tests ne passent pas parce qu'ils prennent trop de temps, c'est que la complexité de nos solutions n'est pas optimale. Ils ont bien calculé leur coup.

              • Partager sur Facebook
              • Partager sur Twitter
              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

              Problèmes d'étagères sur France IOI

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