Opakovalo sa zadanie volebná kampaň:
http://forum.matfyz.info/viewtopic.php?f=247&t=8279
Riešenie:
Najprv si vypočítame vzdialenosti medzi mestami Floyd-Warshallom, čo nám dá maticu, ktorá zaberie kopu miesta. To sa dá vyriešiť tak, že si zapamätáme iba dolný trojuholník z tej matice, čo vychádza na 1MB. Taktiež si zotriedime meetingy chronologicky podľa konca.
Samotné riešenie využíva dynamické programovanie a spočíva v tom, že prechádzame meetingy od prvého do posledného. Máme dve možnosti: na meeting ísť alebo ho vynechať. Pozrieme sa na prekryv meetingu s tými pred ním (tie za ním neriešime). Ak vieme ísť na viac meetingov vynechaním toho, ktorý skúmame tak si zapamätáme doterajšie maximum (uložené s indexom predchádzajúceho meetingu. V opačnom prípade si zapamätáme maximum z meetingov, ktoré sa s nim neprekrývajú + 1 za daný meeting. Zároveň je dobré si pamätať, na ktorom meetingu sme boli naposledy, aby sme vedeli postupnosť meetingov zopakovať. Zistenie, či sa niečo prekrýva je triviálna aritmetická operácia, ale treba myslieť na dĺžku cesty medzi mestami.
Dôležitý postreh: máme daný začiatok kampane a vieme, že potrvá menej ako 31 dní. Teda dátumy vieme reprezentovať ako minúty po začiatku kampane, čo sa zmestí do 2B intu.
Pamäťový limit je 2,5 MB, čo mi najprv znelo odstrašujúco, no je to reálne:
1MB na dolnú trojuholníkovú maticu vzdialeností
0,2MB na tabuľky vytvárané DP (najväčší počet meetingov pre daný meeting a meeting, na ktorom sme boli naposledy)
0,3MB prioritná fronta s predošlými meetingami - tu pomôže mať dátum ako 2B integer
plus zanedbateľné tisíciny ako názvy miest atď
Detaily si rozmyslite ako cvičenie :)
Ku skúške: Holan bol naozaj milý a snažil sa pochopiť moje riešenie do tých najmenších detailov. Ako teoretickú otázku som dostala vonkajšie triedenie.