Cvičení z programování I pro pokročilé

Ve školním roce 2009/2010 vedeme s Milanem Strakou speciální cvičení z předmětu Programování I [NPRG030] pro pokročilé studenty, kteří již nasbírali nějaké zkušenosti z programování (třeba v olympiádách a korespondenčních seminářích) a chtěli by se naučit víc.

Viz též letáček :-)

Cvičení se koná každé pondělí od 12:20 v S6, kdo chcete chodit, přihlašte se, prosíme, v SISu.

Podmínky k získání zápočtu jsou (AND):

Kontakt

Svým cvičícím pište na adresu mami@ucw.cz (Martin+Milan).

Zápočtový program

Domácí úkoly

Domácí úkoly jsou dvou druhů:

Na získání kýžené stovky bodů bohatě stačí praktické úlohy, pokud je řešíte včas.

Teoretické úkoly

DatumIDBodyPříklady
5. 10. funb5Co dělá funkce bc() z letáčku?
funf10Co dělá funkce flr() z letáčku? Jakou má časovou složitost?
liar15Dokažte, že ve hře "mysli si číslo" s nejvýše jednou lží potřebujeme aspoň log2 n + log2 log2 n + konst. tahů.
12. 10. knih10Na cvičení jsme dotříďovali posloupnost, ve které je každý z n prvků na pozici vzdálené nejvýše k od spravné. Jak to udělat, když neznáme k? [lépe než Θ(n log n)]
[+5 bodů] ... se složitostí O(n log k).
real10Představte si, že máte počítač, který umí počítat v konstantním čase s neomezeně velkými a neomezeně přesnými reálnými čísly: sčítat, odčítat, násobit, dělit, umocňovat, počítat celé části apod. Jak na tomto počítači hledat N-té prvočíslo v konstantním čase?
2. 11. elec10Dokažte, že řešení úlohy o volbách, které jsme dělali na cvičení, funguje i s neostrou nerovností.
[+5 bodů] místo důkazu protipříklad :)
elek15Obecnější volby: chceme najít kandidáty, pro které hlasuje více než n/k voličů. Tentokrát si můžeme dovolit paměť závislou na k, nikoliv však na n.
9. 11. knxt10Jak vypsat posloupnosti n nul a jedniček s právě k jedničkami nerekurzivně?
kgry10Jak vypsat posloupnosti n nul a jedniček s právě k jedničkami v takovém pořadí, aby se každé dvě sousední lišily jen na dvou pozicích?
pgry10Jak vypsat permutace na n-prvkové množině tak, aby se sousední dvě lišily právě jednou transpozicí?
23. 11. bfsq15Budeme-li hledat do šířky v rovinném bludišti NxN, jak velká fronta je potřeba? Stačí O(N)?
30. 11. kdim10Zobecnění prefixových součtů: Vymyslete pro pevné d datovou strukturu, která dostane na vstupu d-rozměrnou matici, v čase lineárním s její velikostí provede předvýpočet a pak bude umět zjistit v konstantním čase součet prvků v libovolné d-rozměrné souvislé podmatici (tedy d-rozměrném kvádru).
7. 12. diam10Dokažte, že následující algoritmus správně spočíta průměr stromu (maximum vzdáleností mezi vrcholy): zvolíme libovolný vrchol v, najdeme vrchol x nejvzdálenější od v, najdeme vrchol y nejvzdálenější od x a prohlásíme za průměr vzdálenost xy.
11. 1. tcol15Navrhněte datovou strukturu, která při inicializaci dostane zadaný strom, něco si pro něj předpočítá a pak umí operace "obarvi daný vrchol černě/bíle" a "spočítej, kolik je pod daným vrcholem černých a bílých vrcholů".
10. 5. zapoεBody navíc na výborný zápočťák.
$#

Výsledky

JménoTeoretické příkladyCodExBodůZápočťákZ
David Brázdilfunb(5)8590 BSP stromy
Radim Bufka00
Leonid Buneev4040
Pavel Dvořák0
Richard Ejemfunf(5) funb(5) knxt(10) elec(10) pgry(10)60100 Hledání duplikátů  OK Z
Petr Fanta0
Marek Fišerreal(10) funf(10) funb(5) zapo(15)60100 L-systémy  OK Z
Thomas Jandečka0
Peter Júnošfunb(5)5
Vojtěch Král2020 Crashtest
Jan Matějka100100
Lucie Mohelníková00
Marek Nečadafunb(5) diam(10) knxt(10) kdim(5)70100 Rozvrhovátko  OK Z
Jitka Novotnáfunb(5) knih(5) real(10+...) diam(10)90120 Kaktusy  OK Z
Václav Pernička0
Milan Rybář5050
Veronika Steffanová0
Jan Tichýbfsq(15) funb(5) pgry(10)70100 DeCAPTCHAtor  OK Z
Mikhail Tikhonov00
Pavel Veselýfunb(5) funf(10)90105 Žluťoučký kůň  OK Z
Jakub Vlček0
Martin Zikmund1010
$#

(body z CodExu se přepočítávají jednou nočně)

Co jsme dělali

datum co se cvičilo
5. 10. Jak rotovat pole? Jak najít chybějící perlu? Nebo dvě? Hádání čísla s lhářem.
12. 10. Jak dotřídit knihovnu, když je k knížek špatně? Když je každá vzdálena o nejvýše k od správné polohy? (Jak pomocí haldy, tak tříděním bloků a sléváním.) Šifrujeme mřížkou (opakovaně).
19. 10. Euklidův algoritmus a jeho složitost. Úsek s maximálním součtem (a případně zadanou délkou) – mnoho různých algoritmů. Úsek se zadaným součtem.
26. 10. Jak čísla 1...N opatřit znaménky, aby byl jejich součet roven K? Nejdelší vyvážený úsek. Počítání minim všech úseků dané délky. Počítání součinů bez i-tého prvku (šetříme prostorem). Budou volby.
2. 11. Ještě jednou volby. Generování posloupností nul a jedniček rekurzivně i nerekurzivně. Jak to dělat, když chceme, aby se dvě sousední lišily jen na jedné pozici?
9. 11. Generování posloupností s právě k jedničkami, generování permutací (rekurzivně i nerekurzivně).
16. 11. Míchání karet aneb překvapivě mnoho způsobů, jak si pořídit náhodnou permutaci. Prohledávání do šířky: Problém kulhavého koně. Problém s maticí: máme matici A celých čísel, ostře rostoucí v řádcích i sloupcích, a chceme najít všechny dvojice (i,j) takové, že A[i,j] = i+j.
23. 11. Různé triky na dolní odhady složitosti (maticová úloha z minula, vážení kuliček, třídění, konvexní obaly). Prohledávání do šířky: kulhavé autíčko, Théseus a Minotauros (s mečem), stručně o Patnáctce a nejmenších násobcích daného čísla složených z 0 a 1.
30. 11. Nuly a jedničky.
7. 12. Lezení po stromech: nejdelší cesta, největší nezávislá množina, mafiáni. Asfaltujeme město.
14. 12. Grafoviny: kreslení jedním tahem či nejmenším možným počtem tahů, vyvážená a skoro vyvážená orientace grafu, podgraf s polovičními stupni a párování v 2k-regulárním bipartitním grafu. Mocnění matice sousednosti. Wanted: šéf agentů.
4. 1. Jeřábníkovy starosti. Vyhledávací stromy.
11. 1. Napadl sníh aneb Steinerovy stromy pro body v rovině (jen zmínka). Vyvažovaní stromů pomocí rebuildů, střádáme do prasátek. Počítání inverzí v posloupnosti. Převod permutace na její pořadí a zpět. Jak pro strom předpočítat vhodné údaje, abychom uměli v čase O(1) odpovídat, v jakém příbuzenském vztahu jsou dané 2 vrcholy?
Stránku spravuje Martin Mareš