Napriek tomu, že sa hra môže vyvíjať viacerými spôsobmi, celkový počet rôznych pozícii je len rs + 1. Špeciálnou

Podobné dokumenty
SK MATEMATICKA OLYMPIADA 2010/ ročník MO Riešenia úloh domáceho kola kategórie Z4 1. Doplň do prázdnych políčok čísla od 1 do 7 každé raz tak,

Vzorové riešenia úlohy 4.1 Bodovanie Úvod do TI 2010 Dôvod prečo veľa z Vás malo málo bodov bolo to, že ste sa nepokúsili svoje tvrdenia dokázať, prič

Tue Oct 3 22:05:51 CEST Začiatky s jazykom C 2.1 Štruktúra programu Štruktúra programu by sa dala jednoducho popísať nasledovnými časťami, kto

Informačné technológie

Metódy dokazovanie v matematike 1 Základné pojmy Matematika exaktná veda vybudovaná DEDUKTÍVNE ZÁKLADNÉ POJMY základy každej matematickej teórie sú in

1 Rekurencie este raz riesenia niektorych rekurencii z cvik. mame danu rekurenciu napr T (n) = at ( n b ) + k. idea postupu je postupne rozpisovat cle

Paralelné algoritmy, cast c. 2

Paralelné algoritmy, cast c. 3

2.5. Dotyčnica krivky, dotykový kužeľ. Nech f je krivka a nech P V (f) (t.j. m P (f) 1). Ak m P (f) = r a l je taká priamka, že I P (f, l) > r, potom

Pokrocilé programovanie XI - Diagonalizácia matíc

Úroveň strojového kódu procesor Intel Pentium Pamäťový operand Adresovanie pamäte Priama nepriama a indexovaná adresa Práca s jednorozmerným poľom Pra

Olympiáda v informatike ročník (2018/2019) riešenia krajského kola kategória A Priebeh krajského kola Krajské kolo 34. ročníka Olymp

8 Cvičenie 1.1 Dokážte, že pre ľubovoľné body X, Y, Z platí X + Y Z = Z + Y X. 1.2 Dokážte, že pre ľubovoľné body A, B, D, E, F, G afinného priestoru

Microsoft Word - mnohouholnik.doc

Microsoft Word - 6 Výrazy a vzorce.doc

SK MATEMATICKÁOLYMPIÁDA skmo.sk 2009/ ročník MO Riešenia úloh česko-poľsko-slovenského stretnutia 1. Určte všetky trojice (a, b, c) kladných r

Microsoft Word - skripta3b.doc

Zeszyty Naukowe PWSZ, Nowy Sącz 2013 Konštrukcie magických obdĺžnikov Marián Trenkler Faculty of Education, Catholic University in Ružomberok Hrabovsk

Metódy násobenie v stredoveku

Microsoft Word - Zaver.pisomka_januar2010.doc

Paralelné algoritmy, cast c. 3

Úvod do lineárnej algebry Monika Molnárová Prednášky 2006

Metrické konštrukcie elipsy Soňa Kudličková, Alžbeta Mackovová Elipsu, ako regulárnu kužeľosečku, môžeme študovať synteticky (konštrukcie bodov elipsy

Aplikace matematiky- záverečná práca Juraj Bodík 28. septembra 2017 Definície Žena - objekt ohodnotený celým číslom. Každé dve ženy sa dajú porovnat a

Olympiáda v informatike ročník (2018/2019) zadania krajského kola kategória A Priebeh krajského kola Krajské kolo 34. ročníka Olympi

Cvičenie 9 Riešené príklady 1. Príklad min f(x 1, x 2 ) = x x x 1 s.t. x 1 80 x 1 + x Pre riešenie úlohy vykonáme nasledujúce kroky

N desitka.indd

Preco kocka stací? - o tom, ako sú rozdelené vlastné hodnoty laplasiánu v limite, ked sú velké

MATEMATICKÁ OLYMPIÁDA NA STREDNÝCH ŠKOLÁCH 54. ročník, školský rok 2004/2005 Zadania úloh 3. kola kategórie P 1. súťažný deň Na riešenie úloh máte 4.5

História

Microsoft Word - 06b976f06a0Matice - Uzivatelska Dokumentacia

Teória pravdepodobnosti Zákony velkých císel

Kolmogorovská zložitost

Relačné a logické bázy dát

Prenosový kanál a jeho kapacita

III. Diferenciálny počet funkcie viac premenných (Prezentácia k prednáškam, čast B) Matematická analýza IV (ÚMV/MAN2d/10) RNDr. Lenka Halčinová, PhD.

Novinky programu MSklad

Olympiáda v informatike ročník (2012/2013) zadania domáceho kola kategórie A a B Informácie a pravidlá Pre koho je súťaž určená? Kat

NÁVRH UČEBNÝCH OSNOV PRE 1

Pokrocilé programovanie II - Nelineárne iteracné schémy, chaos, fraktály

Zdravé sebavedomie odzrkadľuje spôsob, akým vidíme sami seba. Ak sa chceme stať sebavedomejšími ľuďmi, musíme zmeniť to, čo si myslíme sami o sebe, ak

03_ControlFlow.dvi

(ıkolské kolo-PYT)

Microsoft Word - Diskusia11.doc

enum

Republika Srbsko MINISTERSTVO OSVETY, VEDY A TECHNOLOGICKÉHO ROZVOJA ÚSTAV PRE HODNOTENIE KVALITY VZDELÁVANIA A VÝCHOVY VOJVODINSKÝ PEDAGOGICKÝ ÚSTAV

Úlohy o veľkých číslach 6. Deliteľnosť In: Ivan Korec (author): Úlohy o veľkých číslach. (Slovak). Praha: Mladá fronta, pp Persistent UR

Slovenská technická univerzita v Bratislave Fakulta informatiky a informačných technológií Ilkovičova 2, , Bratislava 4 Internet vecí v našich ž

Vzhľadom k tomu, že Žiadosť o platbu č

Axióma výberu

M59dkZ9ri10

10 tipov pre tvoj forex úspech

2_detsky pesibus v Novakoch_Putiska Ivan

PowerPoint Presentation

4. Pravidlo ret azenia. Často sa stretávame so skupinami premenných, ktoré zložitým spôsobom závisia od iných skupín premenných. Pravidlo ret azenia p

Centrum vedecko-technických informácií, Odbor pre hodnotenie vedy, Oddelenie pre hodnotenie publikačnej činnosti Vyhľadávanie a práca so záznamami - C

Microsoft PowerPoint - Prog_p08.ppt

Klasická metóda CPM

Dovoz jednotlivých vozidiel – Úvod do problematiky a základné predpisy

Operačná analýza 2

30435_M_Pracovny.indd

Matematický model činnosti sekvenčného obvodu 7 MATEMATICKÝ MODEL ČINNOSTI SEKVENČNÉHO OBVODU Konečný automat predstavuje matematický model sekvenčnéh

Poznámky k cvičeniu č. 2

Prihlásenie sa do systému AIS2 Pomôcka pre študentov Odoslanie záverečnej práce cez AiS2 Spustite si internetový prehliadač a do riadku s adresou napí

SK MATEMATICKÁOLYMPIÁDA skmo.sk 63. ročník Matematickej olympiády 2013/2014 Riešenia úloh česko-poľsko-slovenského stretnutia 1. Dokážte, že kladné re

Algoritmizácia a programovanie - Príkazy

K S P Korešpondenčný seminár z programovania XXXIV. ročník, 2016/17 Katedra základov a vyučovania informatiky FMFI UK, Mlynská Dolina, Bratisla

SK MATEMATICKÁOLYMPIÁDA skmo.sk 64. ročník Matematickej olympiády 2014/2015 Riešenia úloh domáceho kola kategórie Z8 1. Písmenkový logik je hra pre dv

1 Portál pre odborné publikovanie ISSN Heuristický adaptívny PSD regulátor založený na miere kmitavosti Šlezárová Alexandra Elektrotechnika

Microsoft Word - Final_test_2008.doc

Manažment v Tvorbe Softvéru 2018/2019

Import absencí z ASC

Microsoft Word - zapis-predmetov-AiS

7/1/2015 Úvod do databáz, skúškový test, max 25 bodov, 90 min

STRUČNÝ NÁVOD KU IP-COACHU

Univerzita Komenského v Bratislave Fakulta matematiky, fyziky a informatiky Ročníkový projekt (1) Herňa Študijný odbor: Aplikovaná informatika Autor :

K S P Korešpondenčný seminár z programovania XXXIV. ročník, 2016/17 Katedra základov a vyučovania informatiky FMFI UK, Mlynská Dolina, Bratisla

Microsoft Word - Argumentation_presentation.doc

Rozvojom spoločnosti najmä v druhej polovici minulého storočia dochádza čím ďalej tým viac k zásahu človeka do životného prostredia

SK MATEMATICKÁOLYMPIÁDA skmo.sk 66. ročník Matematickej olympiády 2016/2017 Riešenia úloh domáceho kola kategórie Z9 1. Vo všetkých deviatich políčkac

--1/7-- ZŠ Scratch III 10/20 UK M. Tomcsányiová verzia HRA NIM 13 Oblasť informatiky / Téma Algoritmické riešenie problémov / Hra NIM 13 I

MO_pred1

Katalóg cieľových požiadaviek k maturitnej skúške

Autoregresné (AR) procesy Beáta Stehlíková Časové rady, FMFI UK Autoregresné(AR) procesy p.1/22

V jedinej lekcii Meno: 1 Ako reagujete na profesionálne médiá? Pracujte vo dvojiciach a pripravte sa na hranie rolí. Označte sa ako Osoba A a Osoba B.

Digitálne technológie v každodennom živote 3. ročník akademický rok 2019/2020 Harmonogram prednášok

Oceňovanie amerických opcií p. 1/17 Oceňovanie amerických opcií Beáta Stehlíková Finančné deriváty, FMFI UK Bratislava

1. KOMPLEXNÉ ČÍSLA 1. Nájdite výsledok operácie v tvare x+yi, kde x, y R. a i (5 2i)(4 i) b. i(1 + i)(1 i)(1 + 2i)(1 2i) (1 7i) c. (2+3i) a+bi d

NSK Karta PDF

Operačná analýza 2

Agenda záverečnej práce pedagóg Celá agenda týkajúca sa záverečnej práce je dostupná v obrazovke Záverečná práca (menu Agenda pedagóga -> Záverečné pr

Úvodná prednáška z RaL

midterm2019

Spojená škola Tvrdošín Stredná priemyselná škola Ignáca Gessaya Tvrdošín Automatické vyskladňovacie zariadenie Tvrdošín 2018 Peter Holubčík

DediĊnosť

Identity Lifecycle Management

Fond na podporu kultúry národnostných menšín Cukrová Bratislava Smernica o cestovných náhradách na Slovensku a v zahraničí Fondu na podporu

Microsoft Word prist_prava_ Popadic.doc

Verejná konzultácia k článku 18 Nariadenia Komisie (EÚ) 2017/2195, ktorým sa ustanovuje usmernenie o zabezpečovaní rovnováhy v elektrizačnej sústave P

GEODETICKÝ A KARTOGRAFICKÝ ÚSTAV BRATISLAVA Chlumeckého 4, Bratislava II Obsah 1. Export údajov ZBGIS do CAD formá

Prepis:

A-III-1 Oriešková čokoláda Napriek tomu, že sa hra môže vyvíjať viacerými spôsobmi, celkový počet rôznych pozícii je len rs + 1. Špeciálnou pozíciou je celá zjedená čokoláda. Každá iná pozícia počas hry má tvar obdĺžnika, a ten je jednoznačne určený súradnicami jeho pravého dolného rohu. V ľubovoľnej takejto hre (tzv. symetrickej hre s úplnou informáciou) si môžeme pozície rozdeliť na dva typy: vyhrávajúce a prehrávajúce. Pozícia je vyhrávajúca, ak pre hráča, ktorý je v nej na ťahu, existuje stratégia, ktorej keď sa bude držať, tak určite vyhrá. Pozícia je prehrávajúca, ak takáto stratégia existuje pre jeho protihráča. Prázdna čokoláda a tie pozície, z ktorých neexistuje žiaden povolený ťah, sú prehrávajúce pozície. Pre zvyšné pozície rozhodneme či sú vyhrávajúce alebo prehrávajúce na základe jednoduchého rekurzívneho vzťahu. Aby sme vyhodnotili nejakú pozíciu, stačí sa pozrieť na pozície, do ktorých sa z nej dá dostať jedným ťahom. Ak existuje z aktuálnej pozície ťah do nejakej prehrávajúcej pozície, tak je aktuálna pozícia zjavne vyhrávajúca (a dotyčný ťah je prvým ťahom jednej možnej vyhrávajúcej stratégie). A naopak, ak všetky ťahy vedú do vyhrávajúcich pozícií (teda pozícií, v ktorých bude náš protihráč následne mať vyhrávajúcu stratégiu), tak je aktuálna pozícia nutne prehrávajúca. Zostáva iba zistiť, ktoré ťahy sú z danej pozície povolené. Potrebujeme teda vedieť zistiť, či je v poslednom riadku/stĺpci konkrétneho obdĺžnika párny počet orieškov. Priamočiare riešenie na to použije cyklus: prejdeme celý riadok a celý stĺpec a oriešky si spočítame. Takéto riešenie teda každú konkrétnu pozíciu spracuje v čase O(r + s). Celková časová zložitosť tohto algoritmu je teda O(rs(r + s)), jeho pamäťová zložitosť je O(rs). Pokúsme sa vylepšiť vyššie uvedený algoritmus. Pre každé políčko (i, j) si okrem toho, či ide o vyhrávajúcu alebo prehrávajúcu pozíciu, budeme pamätať dve čísla x i,j a y i,j : súčet počtov orieškov v spodnom riadku a v pravom stĺpci zodpovedajúceho obdĺžnika. Keď sa teraz pozrieme na nové políčko (i, j), hodnotu x i,j vieme vypočítať v konštantnom čase: x i,j = x i,j 1 + p i,j. (Teda sa pozrieme na podobný súčet pre o 1 užší obdĺžnik, a prirátame políčko ktoré v spodnom riadku pribudlo. Pritom predpokladáme, že x i,0 = 0.) Podobne vieme hodnotu y i,j určiť z y i 1,j pripočítaním p i,j. No a parita hodnôt x i,j a y i,j nám rovno povie, ktoré ťahy sú v danej situácii platné a ktoré nie. Takto dostávame algoritmus s časovou aj pamäťovou zložitosťou O(rs). Listing programu (Python) # načítame vstup R, S = [ int(x) for x in input().split() ] P = [ [ int(x) for x in input().split() ] for r in range(r) ] # predpočítame súčty v riadkoch a vo stĺpcoch rowsum = [ [ 0 for s in range(s+1) ] for r in range(r+1) ] colsum = [ [ 0 for s in range(s+1) ] for r in range(r+1) ] for r in range(r): for s in range(s): rowsum[r+1][s+1] = rowsum[r+1][s] + P[r][s] colsum[r+1][s+1] = colsum[r][s+1] + P[r][s] # o každej pozícii zistíme, či je víťazná alebo nie winning = [ [ False for s in range(s+1) ] for r in range(r+1) ] for r in range(1,r+1): for s in range(1,s+1): if colsum[r][s]%2==0 and not winning[r][s-1]: winning[r][s] = True if rowsum[r][s]%2==0 and not winning[r-1][s]: winning[r][s] = True print( Anicka if winning[r][s] else Baska ) Na záver už len podotkneme, že keď hodnoty x i,j, y i,j a informácie o vyhrávajúcich/prehrávajúcich pozíciách počítame postupne po riadkoch, stačí si vždy pamätať len jeden predchádzajúci riadok. Takto teda vieme bez zhoršenia časovej zložitosti zlepšiť pamäťovú zložitosť na O(s). strana 1 z 6 úloha A-III-1

A-III-2 Jarné upratovanie Ako bolo v zadaní veľakrát spomenuté, v tejto úlohe ste mali narábať šikovne so súbormi. Prvé, čo ste mohli spraviť je postupne pre každé číslo raz prejsť celý súbor a overiť, či sa v ňom vyskytuje. Za takéto riešenie ste, samozrejme, veľa bodov získať nemohli a ani za jeho drobné vylepšenia, ktoré napríklad naraz kontrolovali vždy 1000 čísel. Pre sofistikovanejšie riešenia už budeme musieť použiť ďalšie súbory. Delenie intervalov Základnou myšlienkou lepšieho riešenia je šikovné rozdeľovanie problému na menšie. Náš problém vyzerá nasledovne: Máme súbor, v súbore sú čísla z nejakého intervalu, a nejaké z nich chýbajú. Pôvodný veľký interval si rozdelíme na niekoľko nových malých intervalov tak, aby boli všetky malé intervaly (aspoň zhruba) rovnako veľké. Pre každý malý interval si spravíme súbor, do ktorého budeme zapisovať čísla, ktoré doň patria. A navyše si pre každý malý interval budeme v pamäti udržiavať počítadlo hovoriace koľko čísel z neho sme už videli. Celé takéto prerozdelenie veľkého intervalu na malé vieme zjavne spraviť v čase nanajvýš priamo úmernom dĺžke veľkého intervalu. Ako nám takéto delenie intervalu pomôže? Tak, že v ňom teraz vieme pokračovať rekurzívne ďalej. V niektorých malých intervaloch nič nechýba počet čísel, ktoré sme do nich dali, je rovný ich dĺžke. Tie môžeme spokojne odignorovať. No a každý malý interval, v ktorom niečo chýba, je teraz nový problém, ktorý môžeme riešiť samostatne, nezávisle na iných. Delenie na polovicu Vo vyššie popísanom riešení sme úmyselne neuviedli jeden detail: na koľko malých intervalov chceme deliť veľký? Pozrime sa najskôr na možnosť, kedy počet malých intervalov bude 2. Inými slovami, aktuálny interval vždy rozdelíme na polovice, zistíme, koľko čísel chýba v ktorej z nich, a potom sa zavoláme na každú, v ktorej chýba aspoň jedno. Akú najhoršiu časovú zložitosť môže mať toto riešenie? Na začiatku máme jeden súbor so zhruba n číslami. Ten rozdelíme na dva súbory so zhruba n/2 číslami, čo nám zaberie O(n) krokov výpočtu. Každý z nich ďalej rozdelíme na dva súbory s n/4 číslami, čo nám opäť dokopy zaberie O(n) krokov výpočtu. A tak ďalej. Keď už budeme mať dostatočne malé intervaly, nastane vytúžená situácia, keď niektoré z nich budú kompletné. Tie nemusíme spracúvať a môžeme ich odignorovať, čím ušetríme čas. Lenže ak nám chýba k čísel a tie sú rozmiestnené zhruba rovnomerne, tak počas prvých log 2 k delení nášho intervalu nám budú vznikať samé menšie intervaly, v ktorých stále ešte niečo chýba. (Napríklad ak by bolo k = 16, tak najhoršie, čo sa nám môže stať, je, že rozdelíme súbor na polovice, polovice na štvrtiny, štvrtiny na osminy, osminy na šestnástiny, a ešte stále v každej šestnástine chýba práve jedno z čísel.) Dokopy teda v takomto najhoršom prípade určite spravíme aspoň rádovo n log k krokov výpočtu. Dá sa dokázať aj silnejšie tvrdenie: toto riešenie má v najhoršom prípade časovú zložitosť Θ(n log k). Za zmienku ešte stojí, že keby sme vôbec nerobili optimalizáciu s tým, že intervaly, v ktorých nič nechýba, netreba spracúvať, dostali by sme časovú zložitosť Θ(n log n). Košaté delenie Keď nám teda nestačí binárne delenie, čo takto delenie na k intervalov? Ukazuje sa, že to sa nám stále zmestí do obmedzenia na počet súborov, ak budeme šikovní. V ľubovoľnom okamihu budeme mať na disku niekoľko súborov, ktoré predstavujú najvzájom disjunktné intervaly v ktorých niečo chýba. Keďže dokopy chýba k čísel, týchto súborov bude v ľubovoľnej chvíli nanajvýš k. V každej iterácii si jeden ľubovoľný súbor zoberieme a prerozdelíme ho na k menších intervalov. Na toto nám bude stačiť k pomocných súborov. Do nich prerozdelíme pôvodný interval. Následne tie z nich, ktoré sú plné, zmažeme, a tie, v ktorých niečo chýba, pridáme medzi intervaly čakajúce na ďalšie spracovanie. strana 2 z 6 úloha A-III-2

(Kedy to celé končí? Keď sa dostaneme k súboru predstavujúcemu interval dĺžky 1, v ktorom ale neleží žiadne z čísel zo vstupu, nedelíme ho ďalej ale jednoducho práve nájdené chýbajúce číslo pridáme do výstupného poľa.) Pozrime sa, či nám to pomohlo s počtom čítaní a zapisovaní. Pri prvom delení potrebujeme načítať aj zapísať všetky čísla, teda spraviť n čítaní zo súboru a n zápisov do súboru. Tým nám vzniklo k intervalov, každý dĺžky n/k. Potom, v najhoršom prípade, potrebujeme ešte raz postupne prerozdeliť všetky tieto intervaly na menšie, čím nám vzniknú intervaly dĺžky n/k 2. Aj toto prerozdeľovanie dokopy vyžaduje n čítaní a n zápisov. Spomedzi týchto intervalov dĺžky n/k 2 však iba nanajvýš k má nejaké chýbajúce číslo. Ďalej teda pokračujeme s intervalmi, ktorých súčet dĺžok je nanajvýš k (n/k 2 ) = n/k. Ich ďalšie prerozdelenie si teda dokopy vyžiada už len n/k čítaní a n/k zápisov. Podobnú úvahu vieme spraviť aj po ďalšej iterácii delenia, tentoraz dostaneme intervaly, ktorých súčet dĺžok je nanajvýš n/k 2. A tak ďalej. Dokopy teda náš program spraví čítaní aj zápisov čísel n + n + n k + n k 2 + n k 3 + < 3n a teda jeho časová zložitosť je lineárna. (Vyššie uvedený odhad platí za predpokladu, že k je aspoň 2. Pre k = 1 použijeme lineárny algoritmus z domáceho kola.) Listing programu (C++) #include <stdio.h> #include <stdlib.h> #define MAXK 100 / Správa súborov, ktorá je tu hlavne na to, aby sme zaručili neprekračovanie počtu súborov / static unsigned num_tmp_files; static FILE file_pool[2 MAXK]; static unsigned file_pool_size; static FILE get_temporary_file (void) { FILE ret; if (file_pool_size > 0) { ret = file_pool[--file_pool_size]; rewind (ret); else { char tmpname[10]; sprintf (tmpname, tmp%d, num_tmp_files++); ret = fopen (tmpname, w+ ); return ret; static void release_tmp_file (FILE f) { file_pool[file_pool_size++] = f; static void remove_temporary_files (void) { unsigned i; for (i = 0; i < num_tmp_files; i++) { char tmpname[10]; sprintf (tmpname, tmp%d, i); remove (tmpname); typedef struct { unsigned f, t, c; FILE s; interval; / Zoznam intervalov, ktoré ešte potrebujeme spracovať / static interval ke_zpracovani[maxk]; static unsigned int_ke_zprac; / Spracuj interval <f,t>, v ktorom je c čisel, nachádza sa v súbore s a deliť ho budeme na d častí / static void zpracuj_interval (unsigned f, unsigned t, unsigned c, FILE s, unsigned d) { FILE tmpfs[maxk]; unsigned pocet[maxk]; unsigned m = t - f + 1; unsigned i, plen, a, ai; for (i = 0; i < d; i++) pocet[i] = 0; / Určíme si veľkosti jednotlivých intervalov a priradíme im pracovné súbory, ak spracúvame krátky interval, rozdeľujeme ho na podintervaly dĺžky 1 / if (m > d) { for (i = 0; i < d; i++) tmpfs[i] = get_temporary_file (); strana 3 z 6 úloha A-III-2

plen = (m + d - 1) / d; else { plen = 1; / Porozdeľujeme čísla do podintervalov / for (i = 0; i < c; i++) { fscanf (s, %u, &a); ai = (a - f) / plen; pocet[ai]++; if (m > d) fprintf (tmpfs[ai], %d\n, a); / Intervaly, v ktorých chýba aspoň jeden packet zaradíme do zoznamu intervalov na spracovanie, prípadne ich vypíšeme, ak v nich chýbajú všetky packety / for (i = 0; i < d; i++) { unsigned l = f + plen i, u = l + plen - 1; interval nint; if (u > t) u = t; if (pocet[i] == u - l + 1) { if (m > d) release_tmp_file (tmpfs[i]); continue; if (pocet[i] == 0) { unsigned j; for (j = l; j <= u; j++) printf ( %d, j); if (m > d) release_tmp_file (tmpfs[i]); continue; nint.f = l; nint.t = u; nint.c = pocet[i]; rewind (tmpfs[i]); nint.s = tmpfs[i]; ke_zpracovani[int_ke_zprac++] = nint; int main(void) { FILE fin = fopen ( pakety.txt, r ); unsigned n, k, d; fscanf (fin, %u%u, &n, &k); d = k < 2? 2 : k; int_ke_zprac = 0; zpracuj_interval (1, n, n - k, fin, d); while (int_ke_zprac > 0) { interval a = ke_zpracovani[--int_ke_zprac]; zpracuj_interval (a.f, a.t, a.c, a.s, d); release_tmp_file (a.s); remove_temporary_files (); return 0; A-III-3 Magické siete Postupne si ukážeme riešenia všetkých troch podúloh v poradí, v akom boli zadané. Simulácia CH pomocou ONE Ako prvé si môžeme všimnúť, že podmienkou ONE(n, n, j) si vieme vynútiť, že n musí byť 0 a j musí byť 1. Vieme teda mať v našej sieti pomocné premenné ktoré majú zaručene hodnotu nula a jedna. Tieto premenné môžeme teraz ďalej používať. Napríklad nám bude užitočná podmienka ONE(x, x, n). Keďže už vieme, že n = 0, musí mať hodnotu 1 práve jedna z premenných x a x. Inými slovami, x je negáciou x. Ďalšia užitočná podmienka, ktorú vieme pomocou ONE simulovať, je podmienka NAND 2 (y, z) (binárny NAND, teda not-and). Táto podmienka je splnená, ak aspoň jedna z premenných y a z nadobúda hodnotu 0. Ako na to? Jednoducho: zoberieme si novú pomocnú premennú p, ktorá nie je použitá nikde inde, a potom nám stačí jediná podmienka: ONE(y, z, p). Pre pevne zvolené y a z vieme nájsť vyhovujúce p práve vtedy, ak neplatí y = z = 1. strana 4 z 6 úloha A-III-3

Tým už máme vlastne polovicu konštrukcie obmedzenia CH hotovú. Ostáva nám ešte zabezpečiť, aby aspoň jedna z premenných x a y mala hodnotu 1. Ale aj to spravíme ľahko. Totiž podmienka aspoň jedna z premenných x a y má hodnotu 1 je ekvivalentná s podmienkou aspoň jedna z premenných x a y má hodnotu 0, pričom x a y sú negácie x a y. No a tie vieme vyrobiť a tak túto podmienku zapísať. Výsledná sieť simulujúca CH(x, y, z) teda obsahuje nasledujúce obmedzenia: ONE(n, n, j) (n je 0 a j je 1) ONE(y, z, p) (aspoň jedno z y a z je 0) ONE(x, x, n) (x je negáciou x) ONE(y, y, n) (y je negáciou y) ONE(x, y, q) (aspoň jedno z x a y je 0) Nemožnosť simulácie ONE pomocou CH Na dôkaz tohto tvrdenia zafunguje technika, ktorú ukazuje príklad 3 v študijnom texte. Ukážeme teda, že pre ľubovoľnú sieť zloženú len z obmedzení typu CH vieme zobrať viaceré platné ohodnotenia a skombinovať ich do iného, ktoré na jednej strane tiež musí byť platné, ale na druhej strane nebude zodpovedať obmedzeniu, ktoré sa snažíme simulovať. Pripomeňme si pomocnú funkciu maj 3 použitú v príklade 3. Táto funkcia (nazvaná podľa anglického slova majority ) vracia na výstup tú z hodnôt 0 a 1, ktorá je na vstupe častejšie. Teda napr. maj 3 (1, 1, 1) = maj 3 (1, 0, 1) = 1, ale maj 3 (0, 0, 1) = 0. Všimnime si, ako funguje obmedzenie CH. Predpokladajme, že trojice premenných (a 1, b 1, c 1 ), (a 2, b 2, c 2 ) a (a 3, b 3, c 3 ) spĺňajú toto obmedzenie. Vypočítajme teraz a = maj 3 (a 1, a 2, a 3 ), b = maj 3 (b 1, b 2, b 3 ) a c = maj 3 (c 1, c 2, c 3 ). Tvrdíme, že trojica (a, b, c) tiež nutne spĺňa obmedzenie CH. Prečo je tomu tak? Keďže naše pôvodné trojice premenných spĺňajú obmedzenie CH, máme aspoň jednu 1 medzi a 1 a b 1, aspoň jednu medzi a 2 a b 2 a aspoň jednu medzi a 3 a b 3. Potom ale musí platiť, že aspoň jedna z premenných a a b má hodnotu 1. (Ak by totiž bolo a = b = 0, tak môže mať hodnotu 1 najviac jedna z premenných a i a najviac jedna z premenných b i.) Analogicky vieme ukázať, že aspoň jedna z nových premenných b a c bude mať hodnotu 0. Predstavme si teraz, že máme sieť zloženú len z obmedzení typu CH, ktorá simuluje obmedzenie ONE(x, y, z). Obmedzenie ONE je splnené pre tri rôzne kombinácie hodnôt x, y a z: (0,0,1), (0,1,0) a (1,0,0). Pre každú z týchto kombinácií hodnôt teda existuje aspoň jedno prípustné ohodnotenie všetkých premenných v našej sieti (vrátane pomocných). Vyberme si teraz tri takéto ohodnotenia premenných tak, aby každé zodpovedalo inej prípustnej kombinácii hodnôt x, y a z. Pomocné tvrdenie, ktoré sme si dokázali vyššie, nám teraz hovorí, že vieme zostrojiť nové, štvrté prípustné ohodnotenie všetkých premenných a to tak, že pre každú premennú zoberieme maj 3 hodnôt, ktoré nadobúda v prvých troch ohodnoteniach. V takto zostrojenom ohodnotení však platí x = y = z = 0, a to je spor s predpokladom, že naša sieť simuluje obmedzenie ONE. Simulácia ľubovoľného obmedzenia pomocou ONE Pripomeňme si zo študijného textu, že slabé obmedzenie S h1...h n je také obmedzenie, ktoré je splnené pre všetky ohodnotenia premenných okrem jediného ohodnotenia h 1,..., h n. Teda napr. slabé obmedzenie S 001 (x, y, z) je splnené vždy okrem prípadu kedy x = 0, y = 0 a z = 1. Zjavne každé obmedzenie X vieme simulovať pomocou vhodnej sady slabých obmedzení: jednoducho postupne vymenujeme všetky kombinácie premenných, pre ktoré naše obmedzenie X nemá byť splnené. strana 5 z 6 úloha A-III-3

Na dôkaz nášho tvrdenia nám teda stačí dokázať, že pomocou ONE vieme simulovať ľubovoľné slabé obmedzenie. Keďže si pomocou obmedzenia typu ONE vieme vyrobiť negáciu ľubovoľnej premennej, stačí nám dokonca vedieť simulovať len slabé obmedzenia typu S 11...1. Každé iné slabé obmedzenie vieme totiž ľahko previesť na takéto. Ukážeme si to na príklade. Predpokladajme napríklad, že chceme simulovať obmedzenie S 0110 (a, b, c, d), teda obmedzenie, ktoré je splnené vždy okrem situácie kedy (a, b, c, d) = (0, 1, 1, 0). Pomocou obmedzení ONE(a, a, p 1 ) a ONE(d, d, p 2 ) si vieme vynútiť, že a a d sú negácie premenných a a d. No a teraz nám stačí vedieť odsimulovať obmedzenie S 1111 (a, b, c, d ). Analogickú konštrukciu vieme zjavne spraviť pre ľubovoľný počet premenných a ľubovoľné iné slabé obmedzenie. Ostáva nám teda posledný krok: pre ľubovoľné k 1 potrebujeme ukázať, ako pomocou ONE simulovať slabé obmedzenie ktoré hovorí, že daných k premenných nesmie mať ako hodnoty samé 1. Ručne vyriešime malé prípady: S 1 (a) vieme simulovať obmedzením ONE(a, a, p), kde p je nová, doteraz nikde nepoužitá premenná S 11 (a, b) vieme analogicky simulovať obmedzením ONE(a, b, p). S 111 (a, b, c) vieme simulovať nasledovnou sieťou: S 11 (a, d), S 11 (b, e), S 11 (c, f), ONE(d, e, f). Ako toto funguje? Posledné obmedzenie si vynúti, že práve jedna z pomocných premenných d, e a f je rovná 1. Nech je to napríklad d. Potom z podmienky S 11 (a, d) dostávame, že a musí byť 0, zatiaľ čo b a c môžu byť ľubovoľné. Jediné ohodnotenie (a, b, c) pre ktoré neexistujú žiadne prípustné (d, e, f) je teda ohodnotenie (1, 1, 1), čo je presne to, čo sme chceli. No a pre k 4 teraz uvedieme všeobecnú konštrukciu indukciou. Predpokladajme, že sme už zostrojili sieť simulujúcu slabé obmedzenie S 11...1 (x 1,..., x k 1 ) s k 1 vstupmi. Uvažujme teraz sieť tvorenú nasledovnými obmedzeniami: S 11...1 (x 1,..., x k 2, z), S 111 (x k 1, x k, z ), a navyše ONE(n, n, j) a ONE(z, z, n). Táto sieť simuluje slabé obmedzenie, ktoré hovorí, že spomedzi x 1 až x k musí mať niektoré hodnotu 0. Ako funguje? Posledné dve obmedzenia už poznáme: hovoria, že n = 0, j = 1 a z je negáciou z. Prvé obmedzenie nám hovorí, že premenné x 1,..., x n 2, z nesmú byť všetky naraz rovné 1. Inými slovami, ak sú x 1,..., x n 2 všetky 1, musí z byť 0. Analogicky z druhého obmedzenia dostávame, že ak x k 1 aj x k sú 1, musí byť z rovné 0. Lenže z a z nemôžu byť naraz rovné 0, a teda nemôžu byť naraz úplne všetky x i rovné 1. Naopak, ľahko nahliadneme, že akonáhle je čo len jedno z x i rovné 0, vieme nájsť vyhovujúce ohodnotenie z a z. TRIDSIATY ROČNÍK OLYMPIÁDY V INFORMATIKE Príprava úloh: Jozef Brandys, Michal Forišek, Askar Gafurov, Jaroslav Petrucha, Michaela Šandalová Recenzia: Michal Forišek Slovenská komisia Olympiády v informatike Vydal: IUVENTA Slovenský inštitút mládeže, Bratislava 2015 strana 6 z 6 úloha A-III-3