Trénink na ACM ICPC contest
Thus spake the Master Programmer:
"After three days without programming, life becomes meaningless."
Toto jsou stránky tréninku na soutěž ACM ICPC.
Na předmětu se podílejí David Bernhauer, Vašek Blažej, Pepa Malík,
Morass, Ondra Suchý
a Tomáš Valla.
Cíl předmětu je jasný: řešit a na místě programovat skutečné soutěžní úlohy,
trénovat algoritmické myšlení i rychlé kódění, a to vše v týmu.
Každý, kdo má byť jen malinký zájem se pocvičit, je vřele vítán!
V případě zájmu se stavte nebo napište mail.
Technicky se zápis na opakovaný trénink (každý semestr) řeší tak,
že jsou vypsány předměty BI-ACMx, kde x je nějaké číslo, a člověk si zapíše to číslo,
které ještě nemá vychozené.
Číslo rozhodně neznamená, že by mezi jednotlivými předměty byla nějaká návaznost
nebo prerekvizita.
Několik technických informací k předmětu
- Pro příznivce ACM ICPC na FIT ČVUT je založen
mailing list ACM.
Stačí se subscribnout, přispívá se na adresu acm (at) turing.cz.
- Tento semestr probíhá každý čtvrtek od 16:15 do 19:30 v učebně TK:PU1, tedy ve 3. patře Nové technické knihovny.
- Trénují/soutěží až tříčlenné týmy.
- Za úspěšně submitnutou úlohu na tréninku dostane každý člen týmu 6 bodů.
- Za úlohu submitnutou až doma do příštího tréninku dostane každý člen týmu 5 bodů.
- Známky dle bodů:
- A: 90 a více
- B: 80
- C: 70
- D: 60
- E: 50
- Jednou za čas pořádáme i dlouhý 5ti hodinový trénink.
Užitečné odkazy
Desatero dovedností úspěšného soutěžícího
- Rychle přečíst a pochopit velké množství zadání v angličtině
- Rychle sestavit "matematický model" problému, tedy zahodit balast a definovat jádro věci
- Rychle identifikovat, v čem spočívá obtížnost úloh
- Umět se rychle rozhodnout, kterým úlohám se věnovat, a které jsou "neřešitelné"
(neboli si vypěstovat intuici, co bude lehké a co těžké)
- Vypěstovat si intuici, který problém vede na jaké řešení a jakým zhruba asi algoritmem
- Umět tu intuici dotáhnout do správného algoritmu
- Umět rychle a bezchybně algoritmus nakódit
- Umět ten kód zdebugovat, ale nikoli u kompu, nýbrž vytištěný na papíře
- Umět si povídat v týmu a úlohy řešit týmově (ve fázi
vymýšlení to HODNĚ pomáhá, ale i ve fázi kódění a debugování),
velmi důležitá dovednost
- Zvládat praktickou psychologii soutěže (dlouhé soustředění,
deprese z postupu ostatních týmů, časový stres, apod.)
Seznam užitečných algoritmů
Tato sekce je (a nejspíš navždy bude) ve výrobě
Jakkoli je důležité umět vymýšlet algoritmu vlastní, často se pro řešení některých úloh
může hodit použít nějaký existující algoritmus či datovou strukturu, který se jenom více či méně přiohne.
Následující seznam algoritmů doporučujeme si předprogramovat a vzít ho na soutěž vytištěný.
Dejte si záležet, ať je napsaný úsporně a přehledně, nebudete mít čas přepisovat kilometry zdrojáku.
Velmi důležité je, ať je kód napsaný vlastnoručně, budete ho typicky modifikovat,
tak ať se v něm vyznáte.
Seznam je mírně roztříděný do kategorií, pokud něco postrádáte, dejte vědět.
Základní datové struktury
Takové ty ultrajednoduché jako spojáky, zásobníky, fronty apod. snad ani nemusím psát.
Vyhledávání a třídění
- na většinu věcí postačí knihovní qsort()
- může se hodit mít předprogramovaný heapsort
- modifikací quicksortu lze řešit rychle některé další úlohy
- kd-Tree
Základní grafové algoritmy
Je určitě třeba mít přehled i v teorii, jaké skutečnosti například
platí pro rovinné grafy, stromy, apod.
- DFS (aplikace např. na souvislost, 2-souvislost, eulerovské tahy)
- BFS
- topologické třídění
- minimální kostry: hladový algoritmus
- minimální kostry: Jarníkův algoritmus
- Dijkstra
- Bellman-Ford (a jeho modifikace na hledání cyklů)
- Floyd-Warshall
- je třeba mít dobrý přehled o základní grafové teorii, umět algoritmy modifikovat
Pokročilejší grafy
- hledání silně souvislých komponent
- union-find problém
- párování v bipartitních grafech
- rychlé toky v sítích: třeba Dinicův algoritmus
- LCA
Stringové algoritmy
Aritmetika a teorie čísel
- GCD
- Eratosthenovo síto
- Rabin-Millerův test
- řešení lineárních kongruencí
- rychlé mocnění
- rychlý výpočet lineárních rekurencí (např. mocněním matic)
Geometrie
Velmi zákeřné úlohy na to neudělat v kódění chybu, spousta speciálních případů, apod.
V podstatě, pokud nemáte tyto algoritmy předkóděné, spíše vůbec nedoporučuji dotyčnou
úlohu řešit (riziko chyby je příliš velké).
Důležité je také co nejvíce oddálit a minimalizovat výpočty v doublech.
Dynamické programování
Zde je asi podstatně důležitější praxe, ale následující problémy jsou
poměrně typické a spousta dynamik je jim podobná.
- editační vzdálenost stringů
- minimální triangulace N-úhelníka
- konstrukce optimálního vyhledávacího stromu
- problém batohu
- různé maximální rostoucí vybrané podposloupnosti, apod.
- rozklad stringu na minimální počet palindromických bloků
Speciality