osaka pod godzillou príklad prvého kola zimnej časti 26. ročníka ksp
DESCRIPTION
Osaka pod Godzillou Príklad prvého kola zimnej časti 26. ročníka KSP. Lu káš Miňo 3Ib [email protected]. Osaka pod Godzillou. Príklad prvého kola zimnej časti 26. ročníka KSP 20 bodov, kategória O V Osake postavili nový rad mrakodrapov. - PowerPoint PPT PresentationTRANSCRIPT
Osaka pod GodzillouOsaka pod Godzillou
Príklad prvého kola Príklad prvého kola zimnej časti 26. ročníka zimnej časti 26. ročníka KSP KSP LuLukáš Miňokáš Miňo
3Ib3Ib
[email protected]@gmail.com
Osaka pod GodzillouOsaka pod Godzillou
Príklad prvého kola zimnej časti 26. ročníka KSPPríklad prvého kola zimnej časti 26. ročníka KSP 20 bodov, kategória O20 bodov, kategória O V Osake postavili nový rad mrakodrapov. V Osake postavili nový rad mrakodrapov. Keď sa o tom dozvedela Godzilla, tak si povedala, že je ten pravý Keď sa o tom dozvedela Godzilla, tak si povedala, že je ten pravý
čas na ich označkovanie (To znamená zanechanie odtlačku nohy čas na ich označkovanie (To znamená zanechanie odtlačku nohy na streche). na streche).
Tak vyliezla na ten najľavejší a rozhliadla sa. Tak vyliezla na ten najľavejší a rozhliadla sa. Zistila, že nemôže označkovať všetky, lebo vie skákať len na nižšie Zistila, že nemôže označkovať všetky, lebo vie skákať len na nižšie
mrakodrapy. mrakodrapy. Zato sa vie rozbehnúť a preto vie skočiť ľubovoľne ďaleko (Jedine, Zato sa vie rozbehnúť a preto vie skočiť ľubovoľne ďaleko (Jedine,
že by cestou stretla vyšší mrakodrap a narazila do neho). že by cestou stretla vyšší mrakodrap a narazila do neho). Avšak Godzilla po boji s Mechagodzillou je unavená a preto keď sa Avšak Godzilla po boji s Mechagodzillou je unavená a preto keď sa
raz rozbehne, tak už nesmie zastať (presnejšie, ak zastane, tak sa raz rozbehne, tak už nesmie zastať (presnejšie, ak zastane, tak sa nerozbehne znova). nerozbehne znova).
Pomôžte Godzille zistiť, koľko najviac mrakodrapov vie označkovať. Pomôžte Godzille zistiť, koľko najviac mrakodrapov vie označkovať.
ÚlohaÚloha
V prvom riadku je N, čo je počet mrakodrapov. V prvom riadku je N, čo je počet mrakodrapov. V druhom riadku je N čísielV druhom riadku je N čísiel v[1], v[2], … v[N] v[1], v[2], … v[N], ktoré , ktoré
označujú výšky jednotlivých mrakodrapov. označujú výšky jednotlivých mrakodrapov. Godzilla stojí na mrakodrape 1. Godzilla stojí na mrakodrape 1. Godzila vie skočiť z mrakodrapu i na mrakodrap j práve Godzila vie skočiť z mrakodrapu i na mrakodrap j práve
vtedy, ak platia nasledovné podmienky: vtedy, ak platia nasledovné podmienky: 1.1. i < j i < j --- nemôže skočiť na predchádzajúci mrakodrap. - nemôže skočiť na predchádzajúci mrakodrap. 2.2. VV[j] > v[i][j] > v[i] --- nemôže skočiť na vyšší mrakodrap. - nemôže skočiť na vyšší mrakodrap. 3.3. Pre všetky k také, že i < k < j, platí: Pre všetky k také, že i < k < j, platí: v[k]<=v[i] -v[k]<=v[i] -- počas - počas
skoku nemôže ,,preletieť'' cez nejaký vyšší mrakodrap. skoku nemôže ,,preletieť'' cez nejaký vyšší mrakodrap. Vašou úlohou je napísať program, ktorý zo zadaných Vašou úlohou je napísať program, ktorý zo zadaných
údajov zistí, koľko najviac skokov môže Godzilla údajov zistí, koľko najviac skokov môže Godzilla spraviť. spraviť.
PríkladPríklad
VstupVstup N = 10N = 10
10 9 8 7 8 9 6 4 2 9 10 9 8 7 8 9 6 4 2 9
VýstupVýstup 5 5
Poznámka:Poznámka: Najskôr skočí na mrakodrap 2 potom na Najskôr skočí na mrakodrap 2 potom na
mrakodrap 6, 7, 8 a 9 a teda bude vo výškach 10 mrakodrap 6, 7, 8 a 9 a teda bude vo výškach 10 9 9 6 4 2 . 9 9 6 4 2 .
1. 1. MožnosťMožnosť
Vyskúšať všetky možnostiVyskúšať všetky možnosti
Vstup:Vstup: 10 9 8 7 8 9 6 4 2 910 9 8 7 8 9 6 4 2 9
Možnosti:Možnosti: 10 (ok), 10 9 (ok), 10 8 (ok), 10 7 (ok), 10 8 (ok), 10 (ok), 10 9 (ok), 10 8 (ok), 10 7 (ok), 10 8 (ok),
10 9 (ok), 10 6 (ok), 10 4 (ok), 10 2 (ok), 10 9 10 9 (ok), 10 6 (ok), 10 4 (ok), 10 2 (ok), 10 9 (ok), 10 9 8 (ok), …, 10 8 7 (ok), …, 10 9 8 7 8 (ok), 10 9 8 (ok), …, 10 8 7 (ok), …, 10 9 8 7 8 (zle), ..., (zle), ..., 10 9 8 7 8 9 6 4 2 9 (zle)10 9 8 7 8 9 6 4 2 9 (zle)..
AlternatAlternatívaíva
Previesť úlohu na grafPreviesť úlohu na graf
10
98 7
9 24
8
6
9
Problém?Problém?
Existuje cyklus?Existuje cyklus?
Nie, lebo godzila skáče od najľavejšieho okraja Nie, lebo godzila skáče od najľavejšieho okraja smerom dopravasmerom doprava
2. možnosť2. možnosť Prehľadávanie do šírkyPrehľadávanie do šírky
10
9
7
8
9
6
4
2
9
88
7
…
7
9
8
…
…
3. mo3. možnosťžnosť
BacktrackBacktrack Vstup - Vstup - 10 9 8 7 8 9 6 4 2 9 10 9 8 7 8 9 6 4 2 9
10
98
6
98
7
4
24
2
… 2
4. 4. možnosťmožnosť
Topologicky utriediť a použiť dynamické Topologicky utriediť a použiť dynamické programovanieprogramovanie
Vstup - Vstup - 10 9 8 7 8 9 6 4 2 910 9 8 7 8 9 6 4 2 9
9 8 7 4 5 3 10 6 2 1 (indexy)9 8 7 4 5 3 10 6 2 1 (indexy) 2 4 6 7 8 8 9 9 9 10 (v2 4 6 7 8 8 9 9 9 10 (výšky budov)ýšky budov) 0 1 2 3 3 4 0 4 5 6 0 1 2 3 3 4 0 4 5 6 (počet skokov) (počet skokov)
4. 4. možnosťmožnosť
Pozor na poradie pri triedenPozor na poradie pri triedení budov rovnakých výšok í budov rovnakých výšok (záleží na poradí indexov)(záleží na poradí indexov)
Správne: Správne: 9 8 7 4 5 3 10 6 2 1 (indexy)9 8 7 4 5 3 10 6 2 1 (indexy) 2 4 6 7 8 8 9 9 9 10 (v2 4 6 7 8 8 9 9 9 10 (výšky budov)ýšky budov) 0 1 2 3 3 4 0 4 5 6 0 1 2 3 3 4 0 4 5 6 (počet skokov) (počet skokov) Nespávne:Nespávne: 9 8 7 4 3 5 2 6 10 1 (indexy)9 8 7 4 3 5 2 6 10 1 (indexy) 2 4 6 7 8 8 9 9 9 10 (v2 4 6 7 8 8 9 9 9 10 (výšky budov)ýšky budov) 0 1 2 3 4 3 5 3 0 6 0 1 2 3 4 3 5 3 0 6 (počet skokov) (počet skokov) DDúfam, že vidno rozdiel úfam, že vidno rozdiel !!!!!!!!
Pre ktorPre ktorú možnosť sa ú možnosť sa rozhodnuť?rozhodnuť?
Faktory:Faktory: Z neznámych príčin nie je obmedzený Z neznámych príčin nie je obmedzený
počet vstupov N (pri väčine úloh je počet vstupov N (pri väčine úloh je rozsah N spomenutý) – prečo? Neviemrozsah N spomenutý) – prečo? Neviem
Musíme aj tak preskúmať všetky cestyMusíme aj tak preskúmať všetky cesty
Najideálnejší algoritmus: BacktrackNajideálnejší algoritmus: Backtrack
Ako implementovať Ako implementovať backtrack?backtrack?
Popis myšlienky:Popis myšlienky: Pokúšame sa prejsť z najľavejšej budovy na Pokúšame sa prejsť z najľavejšej budovy na
najpravejšiunajpravejšiu Cestou zisťujeme, či sa dá na danú budovu skočiťCestou zisťujeme, či sa dá na danú budovu skočiť Ak áno, tak skočíme a pokračujeme predchádzajúcim Ak áno, tak skočíme a pokračujeme predchádzajúcim
krokomkrokom Ak nie, tak sa vrátime o budovu späť a na túto už Ak nie, tak sa vrátime o budovu späť a na túto už
neskáčeme. Skočíme na inúneskáčeme. Skočíme na inú Cestou si zapamätáme počet skokov a maximálny Cestou si zapamätáme počet skokov a maximálny
skokskok Nakoniec vypíšeme maximálny skokNakoniec vypíšeme maximálny skok
Čo si pamätať?Čo si pamätať?
Výšky budovVýšky budov Počet skokov na každú budovu (aby sme Počet skokov na každú budovu (aby sme
sa vedeli vrátiť späť)sa vedeli vrátiť späť) Maximálny skokMaximálny skok Pozíciu i-tej budovyPozíciu i-tej budovy Počet budovPočet budov
Popis algoritmuPopis algoritmu
1.1. Pokial i-ta budova Pokial i-ta budova < po< počet budov rob:čet budov rob:2.2. Ak výška ďalšej budovy Ak výška ďalšej budovy <=<= výška i-tej budovy, výška i-tej budovy,
tak skoč na ďalšiu budovu a zvýš počet tak skoč na ďalšiu budovu a zvýš počet skokov o 1skokov o 1
3.3. Inak zruš danú budovu, zníž počet budov o 1 Inak zruš danú budovu, zníž počet budov o 1 a vráť sa na predchádzajúcu budovua vráť sa na predchádzajúcu budovu
4.4. Ak je počet skokov Ak je počet skokov > > počet maximálnych počet maximálnych skokov, tak maxímalny počet je tento počet skokov, tak maxímalny počet je tento počet skokovskokov
5.5. Vráť sa na krok 1Vráť sa na krok 1
Ukážka algoritmu v C++Ukážka algoritmu v C++
while(i<pocetBudov){while(i<pocetBudov){ if(v[i]>=v[i+1]){if(v[i]>=v[i+1]){ i++;i++; skoky[i]=skoky[i-1]+1;skoky[i]=skoky[i-1]+1; }else{}else{ skoky[i]=0;skoky[i]=0; for(int j=i;j<pocetBudov;j++) v[j]=v[j+1];for(int j=i;j<pocetBudov;j++) v[j]=v[j+1]; i--;i--; pocetBudov--; pocetBudov--; } } if(skoky[i]>maximum) maximum=skoky[i];if(skoky[i]>maximum) maximum=skoky[i]; }}
TestTest
Odhad časovej zložitostiOdhad časovej zložitosti
while(i<pocetBudov){while(i<pocetBudov){ if(v[i]>=v[i+1]){if(v[i]>=v[i+1]){ i++;i++; skoky[i]=skoky[i-1]+1;skoky[i]=skoky[i-1]+1; }else{}else{ skoky[i]=0;skoky[i]=0; for(int j=i;j<pocetBudov;j++){for(int j=i;j<pocetBudov;j++){ v[j]=v[j+1];v[j]=v[j+1]; }} i--;i--; pocetBudov--; pocetBudov--; } }
}}
O(N*N) = O(N^2)
Odhad pamäťovej Odhad pamäťovej zložitostizložitosti
Pole výšok budov (integer)Pole výšok budov (integer) Pole skokov budov (integer)Pole skokov budov (integer)
ZdrojZdroj
http://www.ksp.sk/ksp2.0/wiki/Zadania/26http://www.ksp.sk/ksp2.0/wiki/Zadania/26-1z-1z
Ďakujem za pozornosťĎakujem za pozornosť