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;
}
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.
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.
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.
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.
Discord NaN. Mon site.
Discord NaN. Mon site.