Nombre minimal de quais

Un chef de gare a devant lui la liste des trains passant par sa gare dans la journée. Il lève les yeux vers les quais : aucun train n'est actuellement stationné. Il se demande alors combien de quais seront occupés au maximum à n'importe quel moment de la journée.

La liste des horaires des trains est donnée sous forme d'une liste de couples de nombres : pour chaque train on fournit son heure d'arrivée en gare et son heure de départ. Afin de simplifier les notations, on ne considère que des heures entières.

On garantit que l'heure d'arrivée d'un train est toujours strictement inférieure à son heure de départ.

Exemple
🐍 Script Python
trains = [(3, 5), (2, 4), (6, 8)]

Trois trains vont passer en gare dans la journée :

  • le train A arrivera à 3h et repartira à 5h,

  • le train B arrivera à 2h et repartira à 4h,

  • le train C arrivera à 6h et repartira à 8h.

Pas d'accident !

Les heures d'arrivée et de départ tiennent compte des temps de freinage et d'accélération des trains.

Si, par exemple, un train quitte la gare à 13h, un autre peut tout à fait prendre sa place à 13h pile !

Lorsqu'un train est en gare, il est stationné le long d'un quai et n'en bouge pas. Chaque quai ne peut accueillir qu'un seul train à la fois.

Exemples

En reprenant la liste [(3, 5), (2, 4), (6, 8)], on peut observer sur la figure suivante que les trains A et B sont présents en gare au même moment. Il y aura donc au maximum deux quais occupés en même temps.

Premier exemple

Dans le cas [(1, 3), (6, 7), (5, 6), (3, 5)], aucun train n'est présent en gare en même temps qu'un autre. À chaque instant un seul quai est utilisé.

Second exemple

La première étape de la résolution consiste à construire la liste des évènements associés aux trains de la journée. On appelle « évènement » un couple de nombres contenant :

  • l'heure d'arrivée ou de départ d'un train,

  • la variation du nombre de trains présents en gare : +1 si l'heure correspond à l'arrivée d'un train, -1 si c'est un départ.

Exemple

La liste des évènements :

  • associée à [(3, 5), (2, 4), (6, 8)]

  • est [(3, 1), (5, -1), (2, 1), (4, -1), (6, 1), (8, -1)].

Dans cette liste :

  • le couple (3, 1) indique qu'à 3h, un train arrive en gare (il y a un train de plus stationné),

  • le couple (4, -1) indique qu'à 4h, un train quitte la gare (il y a un train de moins stationné).

Une fois cette liste des évènements créée, on pourra la trier en faisant les_evenements.sort() et l'utiliser afin de calculer le nombre maximal de quais utilisés au même instant.

Tri de couples

La liste des évènements est une liste contenant des couples (horaire, variation).

Lors du tri, Python compare tout d'abord les premières valeurs de chaque couple, les horaires.

Si deux évènements se déroulent à la même heure, Python compare alors les secondes valeurs de chaque couple (les variations).

Ceci nous assure que le tri de la liste des évènements les classe dans l'ordre chronologique et que, dans le cas où deux évènements ont lieu à la même heure, ceux correspondant à des départs (associés à la variation -1) sont placés avant ceux d'arrivée (associés à la valeur +1).

Listes triées ?

Il n'est pas demandé de renvoyer une liste d'évènements triée.

Par contre, les tests comparent les versions triées de chaque liste.

Exemples
>>> trains = [(3, 5), (2, 4), (6, 8)]
>>> evenements(trains)
[(3, 1), (5, -1), (2, 1), (4, -1), (6, 1), (8, -1)]
>>> nb_maxi_quais(trains)
2
>>> trains = [(1, 3), (6, 7), (5, 6), (3, 5)]
>>> evenements(trains)
[(1, 1), (3, -1), (6, 1), (7, -1), (5, 1), (6, -1), (3, 1), (5, -1)]
>>> nb_maxi_quais(trains)
1
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10
.128013s3_8èufvy n7aêS1me(P24C:jtwi][h)6Oo;bcdUg/0làqp.râL-,À=+k95Rxé050N0s0A0n0C0S0b0k0M0S0n0b0b0%010A0C0V010406050b0g0r0r0n0X0j040p0J0S0g120J0l0k020n0r0V0K0k0,0s1c0X0U0g0s0b050Q191b1d1f170V041D1K051N0Q1N1P1K170N0C0i0`0|0~100F0C0P0F0S1%0F0A15050=0L0S0s1Y0}0 011$1(1*1(0A1:1=1.0A0L0J0N1f1/0X1L0A0F0`1i0b0V0n0l100v011@1!010h0@0s0l1q0s1.2f2h2m1_2p1=2s0r2u040a0k0u0X0J0V0J0b0C1l1n0:2d0X0X0s0M2P1D2w0l1L0Q2b2#0A29282a0N2y101*0l2r2M1.1V1X0{1^2/0C2;0l251W1.0V2U1L2Z2#36182g1n2`2n2 0X1c0S150k0q2Y3a16392x3c1_3e3g3i0v3l2h3n2Z2.013s0n3h040k0c3w2!173z3q103C3E0k0w3I3y3a3A3O3i0+3S3K3U3M3B0J3f3D3i0H3Z3o3b1Z3r3(3t3F0m3-3L3:3N3=3*3F0e3_3#3{3%3)3P0*413p433W040q0R483/2{443?0q3k1E3m3!494h4b0q3v4m3x4o4g3d3}3E0q3H4u3J3.3V4z150q3R4D3T4p4y454I3Y4L4w4G4P4c3,4S4F3$4r3^4Y3`4q4H4c404%424)4V0q474L1M341D2^2(0N2,3A0M252E0/1W1L330s353m3S054 0:574N1_0)150:0h594(2n0B3i5k4.3d0h150s0i2r1w2r0A1C4?5l1_14040t5p5e3N152)0?0l5A385C105E0G0y3Z0k5W0k4Z4a5t5v2;2D0l5z3S5Y5Q010J150%5+5Z4h5E0E0D5V5X5?2n5g040h3(5=5-5E5G5B5q3r151d0X1W0s0s5H4x5D150#63685J040:2g0X0A6g3A5S6l5I5.5n042}6w6h6n5L2}5O5864155U4S5X6N5,6m3B5#5w5(5*676x5/040W6t4!6a0V0V2r0N6#4365665P6Q0l6a2T6d6f6W6D015E6k4L6P6X150(6,4h0r0C4I742n5S0G5{6O706{6=045u6T5y6H3x5}1_6Y6!6`3V6%6)0l6+7s3$6.79696o0s6q6s7y6-6j6C3A6Y0!7B1076787H5@150G7c6M5|5-5 2U0A0g0X0l7K6$7i5$5x5)7m3J064T3$5 5i7O016z5Y7S5r150l0L0d1c0-0C0d1z0?7:5d6{657`7h6F5N7`5S6L36066N7o6n1=0b0d7j5%7l7*436Y5;6 8o6R7,7k7/8i156/6I6;5K0X5M8a8B6v7X5W8B7h8q8s7-6U8O5-7q8e150b3(7G6:6x657W8l8m7Y8K0481870g890d0J0M0M0g6)8a7f7L5:8w7577044e8R927+840C952n8y9f1_7Q987d9b435 610X9i5R8H8$040F3(0?2U8G046~369n4q150i1d0C0n2X7~6i048.3m9F9g6z6B8A5-8U1B8W8E6V8+8c6K9m8n9X8082880C8r8|8~909s5.728z9E8T9H9J9L0C1m9*8;6x5 0C5j9W8=8@9/9;8}8 1B9^6Y020P0A0K9^7h9d9B8k4n7e7e9}04apa971049{9Ravab8_9:8{ae9@9a8B7!0;7%7)ay7g15ax8l1D5b564@aX0Q4`1D0A4|a$2*2$24262(0n1;aZ4`1J8b3A2U0r0d0h0n0)0s0d0F0c151v1x1z1B0kar7n1Q3n1K0x1?330J1;0f2D0ka|2O0k7F0C1?2R0|0k0P8M7w1?a|760S1=0k0:0_bgbi2D0_0N002K12760ba01mbD1?0A0Y0M0F1B0W0k0I1n6)1k0k1k0@9:0s0Xb)1n3D0P3(2O0Fbk0.1z1W3D5ybo0J7%bD0.0Ab-762;b.6q0k0s0-1w0VbCbC2 0r0L2UbS2dbBa/9yc47%bJ5u2h0A0k5L9I0@1=b.2r0k0r0obkc41r0_19b.2^b-0bb7bUbWb77F0n0P0.bY1Mbc040O2;bl0J9:0kbt1*0bc4bS0_0.0i0f8u7/0`0X0.cW0#0kbRbt2)bq7r1T1O040Z1?bWc(0-c/0k9I1=cr5YaW040(4ldib c18q0k6b1WcW0_0;dh50040!dldxdnb.dp0N0.7FbFc5dvbK1^7%b-0k1z00cC0M0}bD009x8M0C2U0_0C0:5)0Cb60bc}dpc;c?7.5zcldFdH0kcO2J5)ca0l0i9:cU0.0_0n9Id{0M0s0gdbdL6@0icWbZb#c*0C0L0fck8N0Cc*b7acd|bo6cb?0A0.d3cZc#byc(0_e6cw6cca0h0h2V7$0.c}bR6q4 7%cvd-c=c@d;0N2h0_0SbL0X0NckbWd`1i0J0Pd)1Ab8cY170g0S3n1*cZ2Lc1bW0nb60kd.eTeL1n0r302p1?btdee7cL0g0kchcjbr1?epb*c,e10k0Tc*000?2Rbs0ndw5c9I6cbQaPdm1^8|0CcWflfne d:6~d40Qe@17fLd5bRec6cf5d|192Ofge-eYbR0lfobodUd?1^0.enfc0Jcick9d3gclep9=8 e1bZ0pem0MdRc-f+dT0_bR2Dcvfm0zc0dDfsf8c15adxaxdiew17fK0C3n0Qe;cZ0$c*fs2p2QfbeNg8d+c~1n2Ud}c(f61?fdck2Repf:3Dgh4_0;0?0^04.