Entraînez-vous pour prologin !

Trois exercices pour commencer

Source - le Sam 14 janvier à 18:56:54

Bonjour,

Si vous voulez vous entraîner à Prologin, je vous propose quelques exercices classés en ordre de difficulté :

  • Pyramide, qui est bien pour commencer et tester le système de soumission (celui du site est presque le même que celui de la demi-finale)
  • Pyramides
  • Urgence réseau

N'oubliez pas que l'épreuve machine teste beaucoup votre capacité à coder : écrivez le code pour votre algorithme, et testez-le sur le site. Postez-le ensuite ici dans votre langage préféré (et utilisez http://paste.awesom.eu/ pour ne pas spoiler ceux qui n'ont pas encore trouvé).

21 réponse(s)

Pages: 1 - 2

acieroid # - le Sam 14 janvier à 22:51:22 - Répondre - Source
Avatar

Je viens de faire le premier et le deuxième sans trop de problèmes, mais pour le troisième je me souviens avoir déjà essayé de le faire et ne pas avoir réussi, et je n'ai toujours pas d'idée maintenant. Un petit indice ne ferait pas de mal je pense.

gnomnain # - le Sam 14 janvier à 23:05:03 - Répondre - Source
Avatar

Ouais, le troisième exercice est largement plus difficile. Pour commencer, je suppose que t'as trouvé une condition (simple) pour savoir si deux fibres se croisent ou pas. La deuxième chose à voir c'est que tu peux rendre la condition encore plus simple en ordonnant les fibres par leur position sur une des berges.

Dinosaure # - le Lun 16 janvier à 19:14:26 - Répondre - Source
Avatar

Voici le premier exercice: pyramide

tcpc # - le Mar 17 janvier à 17:08:15 - Répondre - Source

Le mien : http://paste.awesom.eu/tcpc/LHE&hl=python3

Tiens, j'avais une question à propos de l'autre exercice intitulé Pyramides. Je trouve l'énoncé peut clair, en fait. Faut-il seulement ranger les degrés d'adhérence par ordre croissant puis additionner les n premiers termes (n correspondant au nombre d'étages) ou est-ce plus élaboré (au départ, j'avais pensé à un arbre binaire mais en fait, ça va pas) ? (Pour le coup, je trouve l'énoncé vraiment mal foutu et les exemples peu pertinents (l'arbre binaire fonctionne pour 2 ou 3 étages mais pas pour 4 ou plus, par exemple)... Un peu d'aide à la compréhension du sujet ne serait pas de refus.

gnomnain # - le Mar 17 janvier à 19:55:12 - Répondre - Source
Avatar

On te donne le degré d'adhérence de chaque marche de la pyramide. Par exemple, pour le deuxième exemple, la pyramide est :

    811
  740 702
946 380 362

Il faut trouver un chemin entre le haut et le bas de la pyramide pour lequel la somme des degrés d'adhérence est maximale (dans ce cas : 811, 740, 946) et renvoyer cette somme (2497).

tcpc # - le Mar 17 janvier à 20:13:10 - Répondre - Source

Ah, comme le texte parlait d'une case gauche et droite (et que l'exercice précédent faisait mention de deux briques en plus à chaque étage) j'avais modélisé cela comme ça (pour 4 étages, par exemple) :

   ?
  ? ?
 ?? ??
???? ????

Etc. Et donc forcément, ça clochait au niveau du nombre de degrés d'adhérence. :>

Merci gnomnain.

mob # - le Mer 18 janvier à 18:11:14 - Répondre - Source
Avatar

Voilà mon essai pour le troisième : http://paste.awesom.eu/mob/7RO&hl=cpp
Apparemment c'est pas correct. Ça fonctionne sur les exemples de l'énoncé, mais ça ne passe pas les tests sur le site de prologin.
La structure utilisée ne me plaît pas trop non plus. Au début j'utilisais une map, mais apparemment pour la trier il faut quelques artifices supplémentaires, et je voulais faire un truc rapidement.

gnomnain : Pour le premier exemple sur prologin, les fibres sont déjà triées par l'abscisse du côté gauche de la rive, mais ça n'aide pas beaucoup.

gnomnain # - le Mer 18 janvier à 18:38:28 - Répondre - Source
Avatar

Si j'ai bien compris, tu pars d'une situation où tous les câbles sont là, et tu enlève celui qui a le plus d'intersections jusqu'à ce qu'il n'y ait plus d'intersections ? Je pense que c'est trop glouton pour marcher mais j'ai pas de contre-exemple évident.

mob # - le Mer 18 janvier à 18:44:50 - Répondre - Source
Avatar

Oui c'est bien ça.

EDIT : Sur le site de prologin ils n'indiquent pas le test utilisé, juste que la sortie attendue est 5 et que le résultat est 1...
Est-ce qu'il faut obligatoirement compléter le code fournit ? parce que j'avais déjà codé le mien avant et je l'ai soumis tel-quel.

gnomnain # - le Mer 18 janvier à 18:49:27 - Répondre - Source
Avatar

Non, si ton code lit correctement l'entrée, il devrait marcher aussi.

dentuk # - le Lun 23 janvier à 17:13:20 - Répondre - Source
Avatar

Salut, bonne idée de sujet.

  • Pyramide : çay moche mais bon…
  • Pyramides : malheureusement ça ne passe que 5 tests sur 7, le calcul est jugé trop lent.

Je vais regarder un peu le 3ème.

gasche # - le Lun 23 janvier à 18:50:24 - Répondre - Source
Avatar

Le deuxième est un algorithme dynamique. C'est ultra-classique et si tu ne connais pas ces algos, il faut que tu te formes. France-IOI a plein d'exercices sur ça, et cet énoncé ("triangle") est le plus simple d'entre eux, ou presque.

Par ailleurs j'insiste sur le fait que == n'est pas le test d'égalité structurelle en OCaml, il vaut mieux utiliser = (== fait un test d'égalité physique qui a une sémantique différente sur les valeurs construites, même si ça ne change rien sur les entiers).

dentuk # - le Lun 23 janvier à 21:41:04 - Répondre - Source
Avatar

Merci pour tes remarques.

Pour = et == au temps pour moi, je le sais mais je ne pratique pas assez OCaml alors j'ai tendance à écrire == par habitude.

Pour le deuxième algo, j'ai d'abord remarqué que je faisais les mêmes calculs plusieurs fois du fait que la pyramide n'est pas vraiment un arbre (les branches se recoupent). Une version corrigée est ici qui passe bien les 7 tests sur 7 et au passage utilise un array d'arrays ce qui est quand même nettement plus pratique syntaxiquement.

Par contre c'est vrai qu'un traitement de bas en haut comme le fait acieroid est plus intelligent vu qu'il évite ces Todo | Done. J'ai donc écrit ça après, qui passe aussi les 7 tests sur 7 (et ressemble fortement au code d'acieroid).

Pour la programmation dynamique, effectivement c'est quelque chose qu'il faut que je travaille, pour le moment je vois mal ce qui distingue un algo dynamique d'un autre algo. Je vais regarder tout ça plus en détail, merci bien !

gasche # - le Lun 23 janvier à 22:47:41 - Répondre - Source
Avatar

pour le moment je vois mal ce qui distingue un algo dynamique d'un autre algo

Le fait de réutiliser plusieurs fois le résultat du calcul de certains sous-problèmes.

dentuk # - le Lun 23 janvier à 23:55:05 - Répondre - Source
Avatar

Ok, l'article français de Wikipedia sur le sujet était pas vachement clair, ça passe mieux avec la version anglaise. J'ai retrouvé un DM d'info de MPSI qui en parlait à travers une version du problème du sac à dos en comparant une solution récursive exponentielle et une solution dynamique, je vais m'y replonger.

terresMinees # - le Mar 24 janvier à 16:54:59 - Répondre - Source
Avatar

j'ai fait le premier avec l'aide de quelques gens.

Thomash # - le Jeu 26 janvier à 20:57:33 - Répondre - Source
Avatar

Voici mon code pour le premier. Et voici mon code pour le troisième, ce code n'est pas optimal car il est en O(n²) alors qu'il y a une solution en O(n Log n) mais je l'ai quand même écrit pour voir s'il passait les tests et il les passe.

gnomnain # - le Jeu 26 janvier à 21:32:23 - Répondre - Source
Avatar

Effectivement, la solution en O(n²) marche assez bien, c'est celle que j'ai utilisée à prologin quand je suis tombé sur cet exo.

mob # - le Ven 27 janvier à 15:22:33 - Répondre - Source
Avatar

Thomash: Si j'ai bien compris, long.(i) est le nombre de fibres que i ne croise pas et qui la précèdent ? (+1)

Thomash # - le Lun 30 janvier à 01:15:05 - Répondre - Source
Avatar

long.(i) est la longueur de la plus longue sous-suite croissante ayant snd coords.(i) comme dernier élément.

Pages: 1 - 2

Répondre à "Entraînez-vous pour prologin !"

Vous devez être connecté pour poster.