Cvičení z Programování I

Ve školním roce 2005/2006 vedu cvičení z předmětu Programování I [PRG030]. Cvičení se koná každý čtvrtek od 15.40 v S1.

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

Domácí úkoly

DatumIDBodyPříklady
6. 10. 9k2Dokažte, že máte-li n-1 mincí stejné hmotnosti a jednu těžší, je k nalezení té těžší potřeba alespoň ⌈log3n⌉ vážení na rovnoramenných vahách. Že tolik vážení stačí, to jsme ukázali na cvičení; zbývá tedy dokázat, že na méně vážení to už nejde.
12k2Dostali jste 12 kuliček, z nichž jedna je lehčí nebo těžší než ostatní. Popište, jak trojím vážením na rovnoramenných vahách zjistit, která to je a jestli je lehčí nebo těžší.
[+1 bod] Dokažte, že s více než 12ti kuličkami už jsou potřeba 4 vážení a že vzdáte-li se požadavku na zjištění lehčí/těžší (tedy bude stačit jen zjistit, která kulička to je), pak to lze i pro 13, ale pro více už ne.
13. 10. nim11Popište strategii pro hru s odebíráním zápalek s jednou hromádkou, ze které lze v každém tahu odebrat počet zápalek, který je mocninou dvojky. (Hrají dva hráči, pravidelně se střídají, kdo nemůže táhnout, prohrává.)
nim22Popište strategii pro odebírání zápalek se dvěma hromádkami, přičemž hráč na tahu si vždy vybere jednu hromádku a z té odebere libovolný nenulový počet zápalek.
[+1 bod] Totéž pro N hromádek.
bcvt1Napište program, který převádí čísla ze soustavy o základu A do soustavy o základu B. Na začátku si přečte A a B, pak čte jednotlivé číslice čísla a výstup vypisuje opět po číslicích. Můžete předpokládat, že převáděné číslo se vejde do integeru.
[+1 bod] ... základ soustavy může být i záporné číslo.
card1Míchání karet: navrhněte algoritmus pro generátor náhodných permutací na zadaném počtu prvků. Všechny vygenerované permutace by měly mít stejnou pravděpodobnost; můžete předpokládat, že máte k dispozici funkci Random(X), která vygeneruje náhodné číslo od 0 do X-1 s rovnoměrným rozložením pravděpodobností.
20. 10. Cvičení se nekoná, váš cvičící je na soustředění KSP.
27. 10. ibsr1Napište program pro vyhledávání půlením intervalů v nekonečně velkém ostře rostoucím poli. Na hodnoty pole se přitom bude ptát uživatele ("jaký je pátý prvek?" apod.).
sqrt2Naprogramujte celočíselné odmocňování, tj. program, který pro zadané číslo N vrátí dolní celou část druhé odmocniny z N. Hint: půlení intervalu. Hint 2: nepoužívejte typ real.
lies3Hrajme hru "mysli si číslo" s ne úplně čestným protihráčem. Protihráč si vymyslí nějaké číslo X od 1 do N a naším úkolem je uhodnout ho. Můžeme klást dotazy typu "je X menší než A?", jednou za hru můžeme (ale nemusíme) obdržet lživou odpověď. Váš program by měl použít méně než 2*log2n dotazů.
3. 11. divs2Napište program, který pro všechna čísla od 1 do N spočte, kolik mají dělitelů. Zkuste upravit Eratosthenovo síto.
[+1 bod] ... a zachovat původní časovou složitost síta O(n*log log n).
gold2Slavná Goldbachova hypotéza říká, že každé sudé číslo větší než 2 je součtem dvou prvočísel. Napište program, který ji ověřuje, přesněji nalezne pro zadané číslo rozklad na součet dvou prvočísel, existuje-li. Snažte se o časovou složitost O(x*log x) nebo lepší (kde x je zadané číslo).
fact2Naprogramujte rozklad na součin prvočísel. Násobné prvočinitele vypisujte jako mocniny: 80=2^4*5.
10. 11. mult3Pro labužníky: Napište proceduru pro násobení dvou N-ciferných čísel, která bude pracovat v rychlejším než kvadratickém čase. Hint: Násobte čísla rekurzivně po blocích velikosti N/2 a využijte toho, že (A+B)*(C+D)=AC+AD+BC+BD.
mpow2Napište proceduru pro umocňování čtvercových matic, která bude efektivnější než prosté zopakování násobení. Hint: Rozmyslete si nejdříve, jak počítat A64.
1 bod za samotné násobení matic.
17. 11. Cvičení se opět nekoná, jeť státní svátek. Také se narodil A. F. Möbius, byl zprovozněn Suezský průplav a na Měsíci přistál první Lunochod.
24. 11. facz2Napište funkci, která spočte, na kolik nul končí desítkový zápis čísla N!.
[+1 bod] spočtěte navíc poslední nenulovou číslici.
ldiv2Naprogramujte dělení dlouhých čísel.
eulr2Naprogramujte výpočet Eulerova čísla na zadaný počet desetinných míst. Hint: e=Σn1/n!.
1. 12. absu1Napište proceduru, která vypíše všechny posloupnosti a-ček a b-ček obsahující právě A a-ček a B b-ček. Rekurzivní řešení jsme vymysleli na cvičení, zde naprogramujte nerekurzivní založené na nalezení lexikografického následníka.
gray2Napište program, jenž vypíše všechny poslupnosti nul a jedniček délky N v takovém pořadí, aby se každé dvě sousední (i poslední a první) posloupnosti lišily na právě jedné pozici.
brac1Dobře uzávorkovaná posloupnost (DUP) je definována takto:
  • prázdná posloupnost je DUP
  • jsou-li X a Y DUP, pak také XY a (X) jsou DUP.
Napište program, který o zadané posloupnosti rozhodne, zda je to DUP.
brag2Napište program, jenž vygeneruje všechny DUP zadané délky.
8. 12. pgry2Naprogramujte proceduru, která vypíše všechny permutace n-prvkové množiny v takovém pořadí, aby se dvě sousední lišily jen transpozicí (tj. prohozením dvou prvků).
[+1 bod] ... pokud se bude takto lišit i první a poslední permutace.
pnxt2Opět vypisování permutací, tentokrát v libovolném pořadí, ale bez použití rekurze.
domi2Mějme šachovnici o m řádcích a n sloupcích, na níž jsou některé políčka zakázaná, a neomezenou zásobu kostek 1x2. Váš program nechť vypíše všechny možnosti, jak šachovnici pokrýt kostkami bez děr a překryvů.
1 bod za řešení pro obdélník 2xn.
15. 12. eval2Napište program pro vyhodnocování výrazů se závorkami a prioritami operátorů v lineárním čase. Chybně zapsané výrazy by program měl odmítnout.
[+1 bod] ... a s unárními operátory.
sums2Naprogramujte proceduru, která vypíše všechny možnosti, jak zadané číslo rozložit na součet kladných celých čísel. Za různé se nepovažují rozklady lišící se pouze pořadím sčítanců.
22. 12. pow22Vymyslete, jak v konstantním čase o zadaném kladném čísle rozhodnout, zda je mocninou dvojky.
xmas2Santa Clausovi se při doručování dárků porouchalo sobí spřežení, takže dokáže jezdit jenom rovně a zatáčet doprava. Abyste situaci zachránili, napište Santovi program, který dostane mapu města (amerického, takže je to čtvercová síť s překážkami) a souřadnice dvou bodů a odpoví nejkratší trasou pro porouchané soby mezi těmito dvěma body.
5. 1. wlay2Bílá paní Perchta se už k stáru trochu bojí procházet zdí. Naprogramujte pro ni algoritmus, jenž najde mezi dvěma políčky na mapě hrady (čtverečková síť se zdmi) cestu, která projde zdí co nejméněkrát, a z takových cest tu nejkratší.
Tento a následující příklady lze odevzdávat za plný počet bodů do konce zkouškového období.
alge2Jsou dána čísla N a K. Rozhodněte, jak čísla 1...N opatřit znaménky +/- tak, aby jejich součet byl právě K, případně odpovězte, že to není možné.
thes3V jednom labyrintu žili-byli Théseus hrdina a Minotaurus obluda. Cílem Théseovým je uniknout z labyrintu (čtverečkové bludiště), cílem Minotaurovým je Théseus. V každém tahu udělá Théseus jeden krok dle svého vlastního výběru a Minotaurus dva kroky směrem k Théseovi: to znamená, že může-li se posunout v x-ové souřadnici tak, aby se přiblížil k Théseovi, učiní tak; nemůže-li, zkusí totéž v y-ové; pokud nelze ani to, stojí na místě. Napište program, který po zadání plánu bludiště a počátečních poloh Thésea a Minotaura poradí Théseovi trasu, po které může uniknout (lze-li to).
12. 1. isub2Napište program, který v zadané posloupnosti nalezne v polynomiálním čase nejdelší neklesající vybranou podposloupnost.
[+1 bod] ... v čase O(n*log n).
elec2V jakýchsi volbách hlasovalo N voličů, každý odevzdal jeden hlas pro jednoho z kandidátů očíslovaných od 1 do 109. Vyhraje ten kandidát, pro nějž hlasovala více než polovina voličů. Napište program, který co nejefektivněji tohoto kandidáta najde.
sumi2Je dána posloupnost. Nalezněte v lineárním čase souvislý úsek posloupnosti, jehož součet je největší. Dokažte, že vaše řešení funguje.

Libovolný příklad můžete poslat vícekrát, vždy platí nejvyšší dosažené skóre.

Stránku spravuje Martin Mareš