460 likes | 609 Views
Slide 1 of 316. Uždavinys “LENKTYN Ė S” 2007, Daugai Vilius Visockas. Turinys. Uždavinio sąlygos pristatymas “ Paprastas ” uždavinio sprendimas “ Advance d ” uždavinio sprendimas Kaip nereikėjo daryti Tiesioginė lenktynės transliacija. S ąlygos pristatymas. Lenktyniauja N ma šinų.
E N D
Slide 1 of 316 Uždavinys“LENKTYNĖS”2007, DaugaiVilius Visockas
Turinys • Uždavinio sąlygos pristatymas • “Paprastas” uždavinio sprendimas • “Advanced” uždavinio sprendimas • Kaip nereikėjo daryti • Tiesioginė lenktynės transliacija
Sąlygos pristatymas • Lenktyniauja N mašinų. • Jos važiuoja įvairiais grečiais. • Jos startuoja skirtingu laiku. • Norime sužioti kaip išsidėstys po K pirmųjų lenkimų. • Nėra dviejų lenkimų vienu metu • Po K lenkimų visos mašinos bus jau išvažiavusios
Sprendimas (1) • Nagrinėti visas galimas mašinų poras (N x N), skaičiuoti jų lenkimosi laiką, laikus surikiuoti ir išrinkti K-jo lenkimo laiką. • Apskaičiuoti kiekvienos mašinos nuvažiuotą atstumą po K-ojo lenkimo. • Surikiuoti mašinas pagal nuvažiuotą atstumą.
Kaip nereikėjo spręsti (cont.) • “Vienos minutės” sprendimas • Daroma prielaida, kad per vienutę minutę • įvyksta ne daugiau nei vienas lenkimas, nors • sąlygoje pasakyta, kad tiesiog nėra jokių dviejų • lenkimų vienu metu.
Kaip nereikėjo spręsti (cont.) Bėgiko ir vežlio paradoksas: bėgikas niekada neaplenks vėžlio!
Faktai • Įmanomas daugiausiai vienas lenkimas imant bet kokią mašinų porą. • Lenkimo tarp dviejų mašinų gali ir nebūti. • Jei mašinos važiuoja vienodu greičiu, lenkimo nebus niekada. • Lenkimas bus tik tada, jei viena mašina važiuoja greičiau už kitą ir išvažiuoja vėliau.
Sprendimas naudojant heap’ą. • Susirikiuojame mašinas pagal išvykimo laiką Pastaba. skaičius - mašinos numeris laikas 1 2 3 4 5
Sprendimas naudojant heap’ą. • Tikriname ar gretimos mašinų poros lenkiasi. • Jeigu lenkiasi, lenkimo įvykį dedame į heap’ą. 3 2 4 1 5
Paspauskite čia ir sužinosite kas yra heapas! Kas tas “HEAP’as” ???
Heap’as • Duomenų struktūra, gebanti • Greitai surasti mažiausią elementą • Ištrinti/Pašalinti elementą. Puikiai pritaikomas Dijikstros algoritmui.
Heap’as 2 9 6 8 10 15 • Heap’as – pilnas dvejetainis medis • Kiekvienas iš vaikų yra didesnis už tėvą
Heap’asElemento įterpimas (1) 2 9 6 8 10 15 Pirmas elementas dedamas pirmoje laisvoje vietoje.
Heap’asElemento įterpimas (2) 2 9 6 8 1 10 15 Pirmas elementas dedamas pirmoje laisvoje vietoje.
Heap’asElemento įterpimas (3) 2 9 6 8 1 10 15 Kad būtų išlaikytos heap’o savybės, reikia lyginti jį su tėvu. Jei naujas narys mažesnis – sukeičiame.
Heap’asElemento įterpimas (4) 2 9 1 8 6 10 15 Kartojame lyginimą sukeistam elementui. Einam link medžio viršūnės – panašiai kaip rikiavimas įterpimu.
Heap’asElemento įterpimas (5) 1 9 2 8 6 10 15
Heap’asElemento įterpimas (6) 1 9 2 8 6 10 15 • Baigiame, kai: • Prieiname medžio šaknį. • Nebereikia sukeisti elementų.
Heap’asElemento įterpimas 2 9 6 8 1 10 15
Heap’asElemento įterpimas 2 9 1 8 6 10 15
Heap’asElemento įterpimas 1 9 2 8 6 10 15 • Baigiame, kai: • Prieiname medžio šaknį. • Nebereikia sukeisti elementų.
Mažiausias elementas Heap’asMažiausio elemento išėmimas 1 9 2 8 6 10 15 Visada šakninė viršūnė, pagal jo savybes. Mažiausia elementą įsimename, o vietoj jo įrašome paskutinį heap’o elementą. Sumažiname heapo dydį.
Heap’asMažiausio elemento išėmimas 1 Paskutinis elementas 9 2 8 6 10 15
6 9 2 8 10 15 Heap’asMažiausio elemento išėmimas Bet šakninė viršūnė dabar pažeidžia heap’o savybes. Šakninė viršūnė (6) didesnė už 2.
Heap’asMažiausio elemento išėmimas 6 9 2 8 10 15 Ją sukeisime su mažesne iš jos vaikų.
Heap’asMažiausio elemento išėmimas 6 9 2 8 10 15 Jeigu sukeistam elementui vėl pažeistume heapo savybę, reiktų padaryti dar vieną sukeitimą.
Heap’asMažiausio elemento išėmimas 6 9 2 8 10 15 Vėl turime heap’ą...
? ? ? ? Grįžti prie sprendimo ?
Sprendimas naudojant heap’ą. • Surikiuojame mašinas pagal starto laiką • Tikriname ar gretimos mašinų poros lenkiasi. • Jeigu lenkiasi, lenkimo įvykį dedame į heap’ą (raktas – apskaičiuotas lenkimosi laikas) Ar trečia lenkia antrą? Ar antra lenkia ketvirtą? Ar ketvirta lenkia pirmą? Ar pirma lenkia penktą? 3 2 4 1 5
Sprendimas naudojant heap’ą. • Paeiliui išiminėjame įvykius iš heap’o(K kartų), ir: • Imituojame lenkimą: greitesnę mašina lenkia lėtesnę • Sukeičiame mašinas • Patikriname ar aplenktos mašinos nesiveja dar kita mašinaJei taip, įvykį vėl dedame į heapą. • Patikriname ar lenkusi mašina lenks dar kitą Jei taip, įvykį vėl dedame į heapą. 3 2 4 1 5
Tikrinimas ar mašina lenkia kitą Kada A aplenks mašiną B? Tarkime tas laikas yra x, ir (x – TA) * GA = (x – TB) * GB; x * GA – TA * GA = x * GB – TB * GB; x * (GA - GB) = TA * GA – TB * GB; x = (TA * GA – TB * GB) / (GA – GB)
Pastabos Realieji skaičiai. Visiškai teisingame sprendime lenkimo laikas turėjo būti saugomas trupmenoje, nes lyginant realiuosius skaičius galima paklaida, ypač kai lenkimai yra labai artimi.
Atvejų nagrinėjimas • Mašinos juda vienodu greičiu. WW Golf 1 WW Golf 1 • Mašinos niekada nelenkia viena kitos.
Atvejų nagrinėjimas • Mašinos juda nevienodu greičiu. • Greitesnė mašina startuoja vėliau WW Golf 1 Mercedes • Mašinos niekada nelenkia viena kitos.
Atvejų nagrinėjimas • Mašinos juda nevienodu greičiu. • Greitesnė mašina startuoja anksčiau WW Golf 1 Mercedes Greitesnė mašina lenkia lėtesnę
R WW Golf 1 Mercedes # Vilius has signed in. 9.25 [ Vilius ] Adomai, lenkimas :P
R WW Golf 1 Mercedes # Vilius has signed in. 9.28 [ Vilius ] Adomai, tuoj kartos lenkimą! 9.28 [ Adomas ] Joa, matau krč… # Vilius has signed off
# Vilius has signed off # Vilius has signed in [Vilius] 19:21 Aj tiesa... [Vilius] 19:21 Jeigu turite klausimų, galiu atsakyti # Vilius has signed off