První série pátého ročníku KSP
Tyto úlohy pocházejí z desetileté ročenky KSP. Jejich řešení bohužel nemáme v elektronické podobě, takže na ně budete muset přijít sami.Zadání úloh
5-1-1 Anagramy
Dvě slova jsou svými přesmyčkami (anagramy), obsahují-li tatáž
písmena v jiném pořadí. Např. slovo JAKUUB
je přesmyčkou slova
BUUKAJ
(a naopak), zatímco slovo BAKUJ
nikoli. V zadaném souboru
je „slovník“ – cca 100 000 nejvýše desetiznakových slov, jež
nejsou uspořádána podle abecedy. Navrhněte algoritmus a napište
program, který upraví slovník do takového tvaru, abyste zástupům
chtivých hádankářů mohli za tučný obolus promptně (= rychle)
zodpovídat dotazy typu: Jaké přesmyčky slova XYZ
se ve slovníku
vyskytují? Místa na disku je k dispozici dost (nejméně na tři
další slovníky stejné velikosti).
Nápověda: Na jedné americké univerzitě žije profesor, který umí vysvětlit jedno z efektivních řešení této úlohy pomocí několika máchnutí levou rukou a tří slov. (Pro nechápavé pak musí občas přidat ještě jedno.)
5-1-2 Za nezávislost!
Nezávislou množinou obdélníků řádu Max, kde Max je kladné celé číslo, nazvěme takovou množinu obdélníků M, že není možné (ani po libovolném pootočení) žádný z obdélníků z M vložit do jiného obdélníku z M tak, aby nepřečuhoval, a že délky stran všech obdélníků v M jsou kladná celá čísla menší než Max. Např. množina obsahující obdélníky s délkami stran (10,3, )(5,7) a (6,6) je nezávislá (řádu např. 11), zatímco množina s obdélníky (10,3, )(5,7) a (3,7) nikoli. Navrhněte algoritmus a napište program, který pro zadaná kladná celá čísla n, Max vytiskne délky stran obdélníků všech dvouprvkových, trojprvkových, …, až n-prvkových nezávislých množin obdélníků řádu Max. Ze všech množin lišících se jen pořadím nebo pootočením obdélníků vytiskne program vždy jen jednu.
Zadání pro normální lidi: Vytiskněte délky stran (dvojic, trojic, …) obdélníků, z nichž se žádný nedá vložit do nějakého jiného.
Příklad: Pro n=3 a Max=6 program vytiskne (kupříkladu) tyto dvojice a trojice:
(3,2) (4,1) | (1,5) (2,2) | (1,4) (2,2) | (1,5) (4,3) |
(2,4) (3,3) | (5,3) (4,4) | (4,4) (5,1) | (1,4) (3,3) |
(5,2) (4,4) | (1,5) (3,2) | (2,5) (3,3) | (1,5) (2,4) |
(3,3) (1,5) | (1,3) (2,2) | (3,4) (2,5) | (1,5) (2,4) (3,3) |
5-1-3 Čekání^k
Je dáno pole n prvků. V budoucnu bude třeba o postupně přicházejících k prvcích zjišťovat, zda se vyskytují mezi prvky pole. Vhodně se na to připravte. Navrhněte nejlepší řešení vzhledem k hodnotám n, k. Součástí řešení nemusí být program.
5-1-4 Podraz
Je dáno celočíselné pole A[1… MaxN]. Napište co nejrychlejší proceduru, která pro zadané číslo n (1≤ n ≤ MaxN) určí maximální prvek úseku A[1… n].
5-1-5 Netvořky
Topologie v symetrické síti: Síť je množina počítačů (uzlů). Mezi
některými dvojicemi uzlů existuje obousměrné spojení. Každý uzel
zná svou jednoznačnou identifikaci (nějaké číslo, které získá
zavoláním systémové funkce get_node_id()
) a všechny své
bezprostřední sousedy a umí jim všem poslat zprávu.
Navrhněte a nějakým rozumným způsobem zapište algoritmus, jehož provedením na všech uzlech sítě získá každý uzel mapu nejkratších spojení od sebe do všech ostatních uzlů. Vzdálenost mezi uzly x, y je dána minimálním počtem přechodů mezi uzly potřebných k dopravě zprávy z uzlu x do uzlu y.