# Zkouška 26.5.2008

<{ForumPost(poster="Anonymous", timestamp=2008-05-26 11:36:12)}>
Název zadání: Knižní veletrh  
* 10 spisovatelů rozdává na veletrhu autografy  
* veletrh je čtvercová síť 20×20 políček  
* o každé osobnosti víme, kdy přijde a jaká bude jejich trasa, tj. políčko, na kterém se zjeví a posloupnost písmen NSEWX (sever, jih, východ, západ, stát na místě) reprezentující jejich pohyb  
* všechny časy dané "číslem kroku"  
* autogram získám, když stojím ve stejný čas na stejném políčku jako nějaká osobnost, klidně může být více lidí na stejném místě, můžu získat víc autogramů najednou  
* každý autogram má nějakou cenu  
* program má naplánovat trasu, jak sebrat autogramy s co největší celkovou cenou  
  
VSTUP: textový soubor, každá osobnost má jeden řádek:  
 * číslo kroku, kdy přijde  
 * políčko, na kterém začne  
 * trasa  
 * cena autogramu  
  
VÝSTUP: textovýá plán trasy  
 * délka trasy  
 * cena nasbíraných autogramů  
 * políčko, kde začnu  
 * trasa  
  
OMEZENÍ:  
 * 10 osobností  
 * veletrh má rozměry 20×20  
 * délka tras osobností <= 100  
 * osobnost může přijít v kroku od 1 do 5000  
 * paměť k dispozici: 27 MB  
 * cena autogramu je <= MAXINT/10  
  
* priority řešení: 1. co největší cena, 2. nejkratší čas odchodu z veletrhu  
* začínám v kroku 1
<{/ForumPost}>

<{ForumPost(poster="Brekeke", timestamp=2008-05-26 12:55:09)}>
Hmm..ty jo..no ja to mel v 10!*100, takze socialni.... pochlubte se, kdo to ma nejak lip....
<{/ForumPost}>

<{ForumPost(poster="neoangin", timestamp=2008-05-26 12:55:16)}>
Vsadil som na vrabca v hrsti: Popisal som "hladovy algoritmus" (to znamena - odchytavam autora s najcennejsim podpisom, ktory sa nachadza na veltrhu) s tym, ze som v diskusii napisal, ze by sa rozmymi modifikaciami a zlepseniami (napr. vyber startovacieho policka nielen podla casu objavenia prveho autora, ale aj podla ocenenia podpisu jednotlivych autorov; v pripade troch atutorov na vystavisti odchytit dvoch s memsimi podpismi, ktory vsak mozu mat sucet cien vacsi ako ten treti...) dali nachadzat lepise vysledky.  
  
Ako ste ulohu riesili vy? Je niekto isty tym, ze ma optimalne riesenie? ;)
<{/ForumPost}>

<{ForumPost(poster="vrtulex", timestamp=2008-05-26 13:48:40)}>
10!*100? To by nebylo špatný... mě to vyšlo kolem 10!*10^20 v nejhorším případě... v průměrnym by to mělo být mnohem lepší (ořezávání)
<{/ForumPost}>

<{ForumPost(poster="Cabroušek", timestamp=2008-05-26 14:27:25)}>
Já jsem to řešil tak, že jsem si nejprve vygeneroval stavový prostor veletrhu v poli 5 100 x 20 x 20, kdy každá matice 20 x 20 zachycuje stav veletrhu v jednom kroku. Mohu si to představit jako graf, kde z každé bodu matice 20x20 vede nejvýše pět hran do bodů následující matice 20 x 20. Vzhledem k paměťovému omezení není možné graf reprezentovat poitry a zůstaneme v tomto poli. Hrany mají váhu buď nula nebo váhu autogramů, které využitím této hrany získám.  
  
To, kde je která osobnost si pamataju jako bity ve dvoubytovém integeru. Když je tam nula, nikdo tam není.  
  
Samotnou cestu hledám průchodem pole do šířky, kdy heldám nejdelší (resp. nejhodnotnější cestu) v co nejmenším počtu kroků. U každého vrcholu vyzkouším všechny jeho následníky, když by se tím zvýšila jeho hodnota, zapíšu příslušný vrchol jako jeho předchůdce na cestě. U každého vrcholu si kromě osobností, které tam v tu chvíli jsou nebo nejsou pamatuju předchůdce na na nejdelší cestě. Aby mohl algoritmus řádně probíhat, je nutné si pamatovat i jaké osobnosti jsme na cestě potkali a jaké je momentální délka nejdelší cesty do každého z vrcholů - ale kdybych si tyto údaje pamatoval u každé z vrcholů, opět by došlo k překročení paměťového limitu. Stačí si pamatovat údaje ve dvou nesvrchnějších vrstách šířící se vlny (jde udělat třeba sudá - lichá).  
  
Průchod do šířky končí nalezením bodu, kdy jsem potkal všechny osobnosti nebo dojde až dokonce. V poslední matici 20 x 20 vyberu vrcholy které mají nejvyšší délku cesty a procházím ty cesty pozpátku - z těchto cest vyberu tak, která kobnčí dříve (resp. dříver přestane růst) a to je ta správná.  
  
Využil jsem vlastně celou možnou paměť 27 MB.  
  
Časová složitost 5100 * 20^2 * 5
<{/ForumPost}>

<{ForumPost(poster="R.U.R.", timestamp=2008-05-26 15:08:35)}>
10! * 10 * 101, takže řádově 10^10 - není to zřejmě optimální, ale myslím, že je to celkem dobrý, když máš ještě o řád míň, tím líp ;-)  
  
Všechny permutace pořadí spisovatelů, ve kterém je navštívím, a pro každou permutaci musím každého navštívit co nejdřív.  
Permutací je 10!, každého spisovatele musím navštívit v některém z max. 101 kroků, kdy je na veletrhu, a spisovatelů je 10.  
  
A samozřejmě se to dá hodně ořezat, ale nevymyslel jsem takový ořez, aby mi klesla složitost v nejhorším případě - leda bych to musel počítat nějak amortizovaně.
<{/ForumPost}>

<{ForumPost(poster="vrtulex", timestamp=2008-05-26 15:23:45)}>
Cabroušek: nojo, takhle to asi půjde... ale nějak mě to tam nenapadlo... holt co naděláme, že?
<{/ForumPost}>

<{ForumPost(poster="Bimbosh", timestamp=2008-05-26 17:07:14)}>
Jo hele v pohode, ja to udelal obycejnou hloubkou ale s orezavanim, takze na slozitost se radsi ani neptejte. No na to, ze to slo dynamicky tak to asi hloubka nebude optimalni reseni... Kua...
<{/ForumPost}>

<{ForumPost(poster="Turista", timestamp=2008-05-26 18:09:57)}>
Ten příklad mi přijde docela brutální - můžete prosím blíže specifikovat jak dlouho na to bylo, jak to celé probíhalo, jak vypadá ústní kolo a jaké bylo skóre zúčastněných? Snad toho nechci moc, jen krátký report. Díky moc!
<{/ForumPost}>

<{ForumPost(poster="FF", timestamp=2008-05-26 18:26:08)}>
No prijdes tam rano v 9, zkousejici si te odskrne, pak si vemes papir, nekam se posadis.   
Za chvili rekne zadani prikladu s tim, ze se muzes ptat a on ti to upresni. Pokud se nezeptas, tak v programu nemuzes predpokladat, ze neco plati, takze lepsi se ptat. Jinak do zaverecny analyzy poznamenat, ze si predpokladal vstup omezenej treba jen na < 255 autobusu, nebo co ja vim. Pak napise zadani na tabuly a taky tam napise sablonu jak ma vypadat shrnovvaci papir - tj. papir na ktrej napises dekompozici ulohy, diskuzi o volbe algoritmu o prubehu resen atd atd. Po 2 hodinach odevzdas a po odevzdani se zapises na takovej pejpr co tam zkousejici ma. Sou tam dva sloupecky. Kazdej sloupecek ma 3 sekce - pro kazdej den jednu - a je dale clenenej podle hodin, kdy prijdes na ustni. Obecne se nevi, jestli pravej sloupec znamena, ze budes zkousenej Topferem, nebo Holanem.
<{/ForumPost}>

<{ForumPost(poster="vrtulex", timestamp=2008-05-26 18:31:56)}>
Mně to taky přišlo jako dost brutální... jenže ono není... stačí to dobře nahlédnout - a je to za chvíli. To nahlédnutí se mi nepodařilo - důvod je ten, že neumím násobit dvěma...
<{/ForumPost}>

<{ForumPost(poster="neoangin", timestamp=2008-05-26 18:54:59)}>
Bol uz niekto na ustnej casti skusky? Kto vas skusal a co sa pytal? ;) Nech vieme, ake otazky su tento rok v oblube :D
<{/ForumPost}>

<{ForumPost(poster="Anonymous", timestamp=2008-05-26 19:50:24)}>
Písemnou část jsem dělal přímočaře s jednoduchou heuristikou: místo zkoušení všech 10! pořadí jsem zkoušel jen max. po *N* (např. 4) nejbližších spisovatelích a z toho v každém kroku šel k prvnímu nejvýhodnějšímu. Töpferovi se řešení líbilo (prý by hodnotil 1-), ale heuristiku komentoval tak, že je v podstatě zbytečná, že 10! možností se projít dá...  Takže i to nejpřímočařejší zkoušení všech možností asi projde.  Taky navrhoval rozdělit situaci podle intervalů, kdy na veletrhu žádný spisovatel není (což bude většina času) a zkoušet pořadí po částech zvlášť.  
  
Na ústní se ptal na vnitřní/vnější třídění, grafové algoritmy... no nic překvapivého, všechno je v sylabu.  Často chtěl odvodit složitost.
<{/ForumPost}>

<{ForumPost(poster="HonzaK", timestamp=2008-05-26 19:54:54)}>
Ja jsem byl na ustnim dneska, zkousel me Holan.  
Nejdriv si vzal k ruce moji pisemku a mel jsem mu popsat, jak jsem to resil - v prubehu popisu do toho obcas vstoupi, aby se na neco zeptal, pripadne  
aby uvedl protipriklad a take si prubezne procita, co je v pisemce skutecne napsano (aby nekdo nepopisoval jine reseni, nez napsal do pisemky  :D ), urcite je dobre zminit se o slabinach zvoleneho algoritmu (minimalne tak zkousejiciho pripravite o poteseni z ukazani prikladu, na kterem vase reseni selze), mne to, ze jsem si chyby a slabiny uvedomoval, pricetl k dobru.  
Po analyze pisemky se prejde k teorii, konkretne me se zeptal na haldu - tak jsem mu popsal reprezentaci bin. stromem a polem, pak chtel ukazat nejaky konkretni priklad a na nem demonstrovat insert a delete minima, dale se ptal na trideni haldou (tj. heapsort) - princip, casova narocnost...  
Jeste se ptal na to, jak postavit haldu v linearnim case, ale to uz jen tak bokem.  
Celkove bych ustni hodnotil jako prijemnejsi cast zkousky (oproti pisemce), spise se tam da vase celkove hodnoceni zlepsit, nez zhorsit (teda aspon takovy pocit jsem mel ja)
<{/ForumPost}>

<{ForumPost(poster="Him", timestamp=2008-05-26 20:49:41)}>
HonzaK: jak se dela to vytvareni haldy v lin. case? jen se pridavaji prvky a nic se nedela? Dik
<{/ForumPost}>

<{ForumPost(poster="vrtulex", timestamp=2008-05-26 21:23:04)}>
Myslím, že ta halda v lin. čase spočívá v tom, že se staví odspoda (takže u heapsortu odzadu)
<{/ForumPost}>

<{ForumPost(poster="HonzaK", timestamp=2008-05-26 21:23:49)}>

 > Him wrote:HonzaK: jak se dela to vytvareni haldy v lin. case? jen se pridavaji prvky a nic se nedela? Dik

Dela se to, jak to Holan nazval, "ucetnickym trikem":  
Vyjde se z toho, ze pri reprezentaci haldy temer uplnym bin. stromem se velka cast vrochlu nachazi bud v posledni hladine (tj. jsou to listy), nebo predposledni hladine - celkem to vzhledem k exponencialnimu rustu poctu vrcholu vzhledem k hladinam dela n/2 vsech vrcholu, ktere se uz vemou, ze jsou na svem miste, tj. cas na jejich umisteni je 0 (pri reprezentaci polem to odpovida druhe polovine pole).  Dale se vezmou vrcholy, ktere tvori zbytek predposledni hladiny a cast predpredposledni - tech je n/4 a na vlozeni kazdeho z nich potrebujeme max 1 prohozeni (s nejakym vrcholem, ktery uz v hlade je). Pak se vezme dalsich n/8 vrcholu (na umisteni kazdeho z nich potrebujeme max 2 prohozeni), pak n/16 atd.  
  
Tedy celkem je potrebny cas:  0*n/2 + 1*n/4 + 2*n/8 + ... coz je O(n)  
  
Takze tak nejak... :wink:
<{/ForumPost}>

<{ForumPost(poster="Cabroušek", timestamp=2008-05-28 17:58:48)}>
Kdybyste někdo náhodou chtěli brát moc vážně to řešení, co jsem tam napsal, tak to neděleljte, není dobře  :oops: ...  Ale kdyby se to kapánek předělalo, tak to bude fungovat dobře. A mohlo by to mít ještě mnohem menší složitost, jelikož je mnoho tahů, kdy se vlastně nic neděje.
<{/ForumPost}>

<{ForumPost(poster="in5inity", timestamp=2008-05-30 16:54:53)}>
Lidi, dá se na téhle zkoušce vyletět?
<{/ForumPost}>

<{ForumPost(poster="vrtulex", timestamp=2008-05-30 20:56:22)}>
U Topfera to asi možný je... když zvoráš ten algoritmus, tak budeš muset bojovat o 3 (pokud nepůjdeš rovnou)... ale to jsem tak slyšel... já byl u Holana
<{/ForumPost}>

<{ForumPost(poster="in5inity", timestamp=2008-05-31 15:25:45)}>
Mohli byste někdo, kdo už má tuhle zkoušku za sebou napsat z čeho jste se učili, atp? Hlavně moc nechápu, jak moc podrobně to musí být u té písemné části rozebrané. Jestli stačí napsat např. teď si vygeneruju stavový prostor, a prohledávám do hloubky, nebo tam bazírujou na detailech?  
  
DÍK
<{/ForumPost}>

<{ForumPost(poster="R.U.R.", timestamp=2008-05-31 15:37:04)}>
No musí bejt jasný, jak bys to udělal. Aby z toho bylo vidět, že si uvědomuješ, jak konkrétně by se to napsalo, jak přesně by vypadaly datové struktury, aby z toho byla vidět složitost... Určitě nebazírujou na detailech, musí tam bejt to podstatný, to důležitý. Pokud nějakou důležitou věc ohledně řešení budeš vědět akle nenaúpíšeš ji tam, tak to není dobré. Já osobně jsem popsal asi 6 těch velkejch stránek a musel jsem si během toho ořezávat tužku, ale myslím, že jsem to psal zbytečně moc podrobně. Každopádně káš 2 hpdiny času, to toho člověk stihne napsat dost, mě by byla stačila hodka a půl.  
Na písemku jsem se neučil. Na ústní jsem se  učil z poznámek a ze slajdů co má topfer na stránkách, a co se týče těch stromů a takovejch těch datovejch struktur, tak na to jsem kouk v Algovision.
<{/ForumPost}>

<{ForumPost(poster="hoboj", timestamp=2008-06-05 16:53:52)}>
rozhodne nebazirujou na detailech ale musi bejt videt ze vis jak bys to udelal.  
jiank z tech peti tematovejch okruhu co tam mame napsat (postrehy, algoritmus, ds, atd atd) jsem mel jeden a pul a stejne, jelikoz jsem tam mel vsechno dulezity, tak to bylo za jedna.
<{/ForumPost}>

<{ForumPost(poster="Turista", timestamp=2008-06-08 20:08:32)}>
Máte někdo tušení, jak aspoň začít s řešením tohohle příkládku? Nějak vůbec nevím, kde začít a dle čeho navyšovat. Díky  
Zadání: [http://forum.matfyz.info/viewtopic.php?t=1885](http://forum.matfyz.info/viewtopic.php?t=1885)
<{/ForumPost}>

