BI-EP1 Efektivní programování 1 ZS 2011/2012 Ing. Martin Kačer, Ph.D. 2010-11 Martin Kačer Katedra teoretické informatiky Fakulta informačních technologií České vysoké učení technické v Praze Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
Výpočet plochy mnohoúhelníku Zadán postupně obvod Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 2
Udržuji svislou souřadnici Při pohybu vpravo přičtu, co je pod stranou Při pohybu vlevo odečtu Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 3
Udržuji svislou souřadnici Při pohybu vpravo přičtu, co je pod stranou Při pohybu vlevo odečtu Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 4
Udržuji svislou souřadnici Při pohybu vpravo přičtu, co je pod stranou Při pohybu vlevo odečtu Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 5
Udržuji svislou souřadnici Při pohybu vpravo přičtu, co je pod stranou Při pohybu vlevo odečtu Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 6
Udržuji svislou souřadnici Při pohybu vpravo přičtu, co je pod stranou Při pohybu vlevo odečtu Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 7
Udržuji svislou souřadnici Při pohybu vpravo přičtu, co je pod stranou Při pohybu vlevo odečtu Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 8
Udržuji svislou souřadnici Při pohybu vpravo přičtu, co je pod stranou Při pohybu vlevo odečtu Co opačný směr? Na konci vyjde záporné Jen otočím znaménko Co záporné souřadnice? Nevadí! Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 9
Kontrola párování závorek Číst od začátku a ukládat na zásobník Při jakékoli nesrovnalosti hlásit chybu Na konci musí být zásobník prázdný Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 10
for (;;) { c = getchar(); switch (c) { case '(': c2 = getchar(); if (c2 == '*') return 5; ungetc(c2, stdin); return 1; case '*': c2 = getchar(); if (c2 == ')') return -5; ungetc(c2, stdin); break; case ')': return -1; case '[': return 2; case ']': return -2; case '{': return 3; case '}': return -3; case '<': return 4; case '>': return -4; case '\n': return 0; } } Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 11
Oddělení zpracování vstupu a kontroly závorek Zjednodušuje situaci, omezuje opakování kódu Zmenšuje prostor pro chyby top = 0; correct = 1; while ((par = nextpar())) { if (par > 0) { stack[top++] = par; } else { if (top == 0) correct = 0; else if (stack[--top]!= -par) correct = 0; } } if (top > 0) correct = 0; Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 12
Reprezentace čísel prvočíselným rozkladem 23 = 23 1 24 = 2 3. 3 1 25 = 5 2 26 = 2 1. 13 1 27 = 3 3 Součin je pak součtem exponentů 23. 24. 25. 26. 27 = 2 3+1. 3 1+3. 5 2. 13 1. 23 1 Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 13
Počet nul = počet násobků deseti, tj. 2 a 5 6000 = 2. 3. 10 3 = 2 4. 3. 5 3 Menší z exponentů u dvojky a pětky 3 nuly Pozorování: V případě faktoriálu je dvojek vždycky víc než pětek! Dvojka každé druhé (sudé) číslo přidá alespoň jednu Pětka obsahuje ji každé páté číslo Stačí počítat mocninu pětky Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 14
Sečteme mocniny pětky všech čísel od jedné do N 12! = 12. 11. 10. 9. 8. 7. 6. 5. 4. 3. 2. 1 Každé páté číslo přidá jednu Ale pozor! Každé 25. číslo přidá 5 2 Každé 125. číslo přidá 5 3 atd. Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 15
int x = nextint(), res = 0; for (int f = 5; f <= x; f *= 5) res += x/f; System.out.println(res); Ano, to je opravdu CELÉ řešení Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 16
Najít maximální souvislý trojúhelník Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 17
Možná se nám budou lépe představovat čtverečky Nepřipomíná to něco? Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 18
Pro každý čtvereček si pamatujeme, jaký maximální čtverec v něm může končit Lze to zjistit z předchozích čtverečků?!!! 3 3 Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 19
Princip je stejný 2 2!! Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 20
Princip je stejný Jen práce s indexy je trochu tricky 1 2 3 4 5 6 7 8 9 1 1,1 1,3 1,5 1,7 1,9 1,2 1,4 1,6 1,8 2 2,2 2,4 2,6 2,8 2,3 2,5 2,7 3 3,3 3,5 3,7 3,4 3,6 4 4,4 4,6 4,5 5 5,5 Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 21
Použijeme opět zarážku na nulté pozici a kolem kraje for (int i = 1; i <= n; ++i) for (int j = i; j <= n*2 - i; j += 2) { if (!triangle[i][j]) max[i][j] = 0; else if (!triangle[i-1][j]) max[i][j] = 1; else max[i][j] = Math.min(max[i-1][j-1], max[i-1][j+1]) + 1; if (max[i][j] > best) best = max[i][j]; i-1, j-1 } i-1, j i, j i-1, j+1 Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 22
Nezapomeneme na obrácené trojúhelníky! for (int i = n-1; i >= 1; --i) for (int j = i+1; j <= n*2 - i; j += 2) { if (!triangle[i][j]) max[i][j] = 0; else if (!triangle[i+1][j]) max[i][j] = 1; else max[i][j] = Math.min(max[i+1][j-1], max[i+1][j+1]) + 1; if (max[i][j] > best) best = max[i][j]; } i, j i+1, j i+1, j-1 i+1, j+1 Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 23
Máme pravoúhlý mnohoúhelník Hledáme bod, ze kterého je vidět celý obsah Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 24
Není to tak složité, jak to vypadá! Stačí se omezit na viditelnost všech stěn Průnik ze všech stěn dá výsledek Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 25
To samé jinými slovy: Kamera musí být napravo od všech levých stěn nalevo od všech pravých stěn nahoře od všech spodních stěn dole od všech horních stěn Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 26
void oneedge(int x1, int y1, int x2, int y2) { int d, x; if (x1 == x2) { x = x1; d = (y1 < y2)? DIR_UP : DIR_DOWN; } else { x = y1; d = (x1 < x2)? DIR_RIGHT : DIR_LEFT; } if (x < min[d]) min[d] = x; if (x > max[d]) max[d] = x; } boolean getresult() { return (max[dir_left] <= min[dir_right] max[dir_right] <= min[dir_left]) && (max[dir_up] <= min[dir_down] max[dir_down] <= min[dir_up]); } Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 27
Pro přehlednost oddělíme procházení bodů Nezapomeneme na poslední stěnu (také lze přidat první bod znovu na konec pole) int x0 = nextint(), y0 = nextint(); int xp = x0, yp = y0; while (--n > 0) { int x = nextint(), y = nextint(); oneedge(xp, yp, x, y); xp = x; yp = y; } oneedge(xp, yp, x0, y0); Řešení 2. sady úloh Martin Kačer, BI-EP1, ZS 2011 28