Probleme exo prologin

Probleme exo prologin - Java - Programmation

Marsh Posté le 09-10-2019 à 13:05:02    

Bonjour, je suis en train de faire un exercice de prologin dont voici l'énoncé. https://prologin.org/train/2017/qua [...] 842#submit
 
Le but est simple un utilisateur entre un nombre de paire de ski désiré, puis leur taille respectif et enfin la liste des tailles en stocks.
 
si un utilisateur entre 5 (5paire de ski désiré), 46(la taille de paire de ski qu'il désire),  enfin la liste des tailles de paires dispo  12 37 50 42 25
 
le but est de trouver la taille de paire dispo la plus proche de 46, ici ce serait donc 50 et 42 car  46 - 50 = -4  46 - 42 = 4   mais si jamais il y a egalité il faut choisir la plus petite  valeur on aura donc ici 42.
 
Mon programme est le suivant mais ne pas passe le deuxieme test, pos2 ne prend jamais la valeur qu'il devrait à la fin du programme. Quel est le probleme? merci
 
 
 

Code :
  1. public static void main(String[] args) {
  2.    int nbrePaireReserve= input.nextInt();
  3.    int tailleSki = input.nextInt();
  4.    int[] listeTaille = new int[nbrePaireReserve];
  5.    int[] tab = new int[nbrePaireReserve];
  6.    int min = 10000;
  7.    int pos1 = 0;
  8.    int pos2 = 0;
  9.    for(int i = 0; i < nbrePaireReserve; i++){               // On remplit la liste des tailles de ski en fonction du nombre de paire desiré
  10.      listeTaille[i] = input.nextInt();
  11.    }                                             
  12.    for(int i = 0; i < nbrePaireReserve; i++){               // On ajoute dans un nouveau tableau la différence entre (taille de ski désiré et taille de ski en stock)  
  13.      tab[i] = valABS(tailleSki - listeTaille[i]);
  14.    }                                           
  15.    for(int i = 0; i < nbrePaireReserve; i++){              // on cherche le minimum du nouveau tableau qui correspond en fait à la taille la plus proche ( le minimum est -4 a la position 2 donc 50
  16.     if(tab[i] < min){
  17.       min = tab[i];
  18.     }
  19.    }
  20.    for(int i = 0; i < nbrePaireReserve; i++){             // maintenant on cherche dans le tableau la position à la quelle la difference est egale min pos2 devrait etre egale a 3 mais il nen est rien
  21.     if(tailleSki - listeTaille[i] == min){
  22.       pos2 = listeTaille[i];
  23.     }
  24.    }
  25.      System.out.println(listeTaille[pos2]);
  26.    }
  27. }

Message cité 1 fois
Message édité par Nat1329 le 09-10-2019 à 13:06:29
Reply

Marsh Posté le 09-10-2019 à 13:05:02   

Reply

Marsh Posté le 09-10-2019 à 18:19:56    

Nat1329 a écrit :

Bvoici l'énoncé. https://prologin.org/train/2017/qua [...] 842#submit
 
Le but est simple un utilisateur entre un nombre de paire de ski désiré, puis leur taille respectif et enfin la liste des tailles en stocks.


Bonjour,
 
Ce n'est pas ce que je lis dans l'énoncé !
Le client demande UNE paire de skis à laquelle est associée UNE taille.
 
Les entrées sont le nombre de skis en réserve, la liste des tailles des skis en réserve et enfin la taille demandée. Cela t'évitera de te mélanger les pinceaux déjà. ;)  
 
Je n'ai par contre pas compris la contrainte sur la liste Si (liste des tailles dispos). Est-ce la longueur de la liste, pas de sens puisqu'elle ne peut pas être plus longue que le nombre de skis en stock ? Est-ce la taille des skis, ça ne fait pas très réaliste ?
 
Sinon pour ton algo :

Code :
  1. tab[i] = valABS(tailleSki - listeTaille[i]);


Code :
  1. min = tab[i];


Code :
  1. if(tailleSki - listeTaille[i] == min)


 
Il n'y a rien qui te choque dans ton test d'égalité ?


Message édité par MaybeEijOrNot le 09-10-2019 à 18:24:35

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 09-10-2019 à 18:50:11    

Salut,
 
merci pour la réponse.  Dans mon test d'égalité, je ne vois pas mais peut etre tu pourras me renseigner?


Message édité par Nat1329 le 09-10-2019 à 18:55:20
Reply

Marsh Posté le 09-10-2019 à 19:15:12    

Dans ton test d'égalité, remplace ta variable "min" par son calcul. ;)


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 09-10-2019 à 19:27:58    

Par son calcul? c'est a dire? en fait je prends la valeur min pour la comparer de nouveau et recuperer sa la plus petite valeur dans pos2.
 
un exemple 46 est la taille demandé
12 37 50 42 25 sont les tailles reservé
 
je veux récuperer la taille la plus proche dans la liste de taille reservé.
 
je fais donc la soustraction(en valeur absolu) de 46 avec chacune des valeurs du tableau. ca donne 34 9 4 4 25. j'ajoute ca dans un nouveau tableau (nommé tab ici) puis je cherche le minimum qui est ici 4.
 
comme il peut y avoir plusieurs fois le meme minimum,
 
je soustrais la taille de nouveau avec toutes les valeurs du tableau
12 37 50 42 25   ca donne 34 9 -4 4 21  je recupere ensuite la position pour min = 4 d'ou la condition qui correspond à 42!

Reply

Marsh Posté le 09-10-2019 à 19:42:08    

Tu utilises un cas particulier où tu as deux tailles à la même distance de la taille demandée, refait le même raisonnement avec qu'une seule taille qui colle. Parfois ça fonctionnera, et d'autres non, par exemple si tu retires la taille 42 de ta liste ça ne fonctionnera pas.
 
Pour comprendre ton erreur, il faut regarder ton égalité, en remplaçant "min" par "tab[i]" puis en remplaçant "tab[i]" par son calcul. (tout est dans les 3 lignes que j'ai cité)


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 09-10-2019 à 19:56:31    

Ah oui autant pour moi! Jai corrigé l'erreur ca compile et ça fonctionne merci beaucoup!

Reply

Marsh Posté le 09-10-2019 à 20:34:13    

Par contre, en corrigeant, tu enlèves le traitement du cas particulier où deux tailles sont à la même distance de la taille demandée.
Je ne sais pas comment tu as corrigé, mais n'oublie pas ce cas où il faut garder la taille la plus petite !
Sinon, tu peux aussi optimiser ton code, en deux boucles tu dois pouvoir t'en sortir.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 09-10-2019 à 22:03:48    

salut!
 
alors mon programme marche mais c'est bien ce que je pensais il marche une fois sur 2 en fait quand ya deux valeur minimum il ne marche plus donc oui ca a corriger un probleme mais dans le cas des deux valeurs il ne marche plus du coup tu as pas une solution pour régler ca?
 
oui bien sur j'optimise toujours quand le programme fonctionne pour le moment je cherche à le faire fonctionner et ensuite effectivement je limiterai les boucles

Reply

Marsh Posté le 09-10-2019 à 22:15:51    

Test passé !
 0,05s  22,7 Mio  Test passé !
 0,21s  43,4 Mio  Test échoué : votre programme s'est exécuté correctement, mais :  
Sortie standard attendue :
101496234
Sortie standard du programme :
0
 Test ignoré.
 Test ignoré.
 Test ignoré.
 Test ignoré.
 Test ignoré.
 Test ignoré
 
 
voila ce que j'obtiens avec la premiere version

Reply

Marsh Posté le 09-10-2019 à 22:15:51   

Reply

Marsh Posté le 10-10-2019 à 18:49:45    

Parfois optimiser en cours ça aide à voir plus clair, multiplier les boucles c'est parfois un risque d'en perdre la tête.
 
Tu peux fusionner tes deux dernières boucles, il te suffit de garder dans une variable la position de ton itération quand tu trouves un nouveau minimum.
Ta recherche de minimum fonctionne très bien, néanmoins ce n'est pas que le minimum que tu souhaites trouver, tu veux le minimum en valeur absolue et le minimum dans le cas où tu as une égalité. Tu dois trouver le moyen de tester ces deux cas en même temps !
 
Au final, tu peux tout faire en une seule boucle, il te suffit de regarder à chaque taille ajoutée dans la liste des tailles en réserve, si la nouvelle taille est la plus proche (par rapport aux précédentes) ou non de celle désirée par le client. Si elle est la plus proche ou à égalité avec une autre tu gardes en mémoire la taille la plus faible.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed