54. ročník Matematické olympiády 2004/2005
|
|
- Jitka Machová
- před 6 lety
- Počet zobrazení:
Transkript
1 54. ročník Matematické olympiády 2004/2005 Řešení úloh krajského kola kategorie P P-II-1 Prádelní salón Při řešení této úlohy použijeme řešení úlohy P-I-1 Prádelna z domácího kola. Jedinou změnou oproti domácímu kolu je podmínka, že žádný zákazník v době, kdy bude prát, neuvidí dva různé zákazníky používat tutéž pračku. Jinak řečeno, pračka, kterou používal zákazník Cyril, může být použita až v momentě, kdy ze salónu odejde poslední zákazník, který pral prádlo současně s Cyrilem. Řekněme, že ze všech zákazníků, kteří prali prádlo zároveň s Cyrilem, je Metoděj ten, který odejde ze salónu nejpozději. Potom pračku, kterou používal Cyril, může použít další zákazník až po odchodu Metoděje ze salónu. Využijeme tohoto pozorování tak, že z původních zakázek vytvoříme nové zakázky, které budeme nazývat stínové. Stínová zakázka zákazníka A bude stejná jako původní zakázka zákazníka A, pokud je v době jeho odchodu salón prázdný. Pokud tomu tak není, konec stínové zakázky zákazníka A bude čas, kdy ze salónu odejde poslední zákazník, který pral prádlo zároveň se zákazníkem A. Řešení úlohy s původními zakázkami a podmínkou, že žádný zákazník v době, kdy bude prát, neuvidí dva různé zákazníky používat tutéž pračku, je shodné s řešením úlohy se stínovými zakázkami bez této podmínky. Stínové zakázky drží nějaké pračky obsazené až do doby, než je může Bořivoj znovu použít. K nalezení řešení úlohy se stínovými zakázkami pak lze použít řešení domácího kola. Při řešení úlohy budeme postupovat tak, že ze zadaných zakázek vytvoříme stínové. Takto vytvořenou úlohu pak vyřešíme jako v domácím kole. Stínové zakázky vytvoříme následujícím postupem. Jako v domácím kole vytvoříme události příchodu a odchodu pro každého zákazníka. Tyto události setřídíme (události odchodu před příchody, které nastanou ve stejný čas). Setříděné události jednou projdeme (podle vzrůstajícího času) a budeme si udržovat dobu T, kdy ze salónu odejde poslední zákazník, který je v salónu právě přítomen. Dobu T lze snadno udržovat tak, že kdykoliv narazíme na příchod nějakého zákazníka, novou hodnotu doby T zjistíme jako maximum její minulé hodnoty a doby, kdy chce zpracovávaný zákazník ze salónu odejít. Průchod nad setříděnými událostmi bude probíhat tak, že když narazíme na příchod zákazníka A, upravíme dobu T. odchod zákazníka A, vytvoříme stínovou zakázku pro zákazníka A, jejíž příchod nastavíme na příchod zákazníka A a odchod na dobu T (která je v té chvíli větší nebo rovna době, kdy chtěl ze salónu odejít zákazník A). Tento průchod lze provést v čase O(N). Třídění událostí nám ale zabere čas O(N log N). Paměti budeme potřebovat O(N) na uložení zadaných zakázek, stínových zakázek a setříděných událostí. Druhá část řešení, algoritmus z domácího kola, má stejnou časovou i paměťovou složitost jako právě popsané vytvoření stínových zakázek, a tak je celková časová složitost našeho řešení O(N log N) a paměťová pak O(N). #include <stdio.h> #include <stdlib.h> #define MAX_N 100 struct zakazka { long z,t; /* začátek a doba trvání */ ; struct udalost { long t; /* čas události */ char prichod; /* příchod nebo odchod */ int zakaznik; /* číslo zákazníka této události */ ; /* porovnání událostí: třídí se podle času a v případě shody času nejdříve odchod */ int udalost_cmp(const void *e1,const void *e2) { if (((struct udalost *)e1)->t == ((struct udalost *)e2)->t) return ((struct udalost *)e1)->prichod - ((struct udalost *)e2)->prichod; return ((struct udalost *)e1)->t - ((struct udalost *)e2)->t; int N; struct zakazka zakazky[max_n]; int stack[max_n]; int stack_top=0; /* index prvního neobsazeného místa ve stacku */ int prirazeni_pracek[max_n]; 1
2 int pocet_pracek=0; struct udalost udalosti[2*max_n]; void uprav_udalosti(void) { struct udalost prichody[max_n+1]; struct udalost odchody[max_n+1]; int prichody_len=0,odchody_len=0,i; long max_odchod=-1; /* zarážka pro slévání */ prichody[prichody_len++].t=-1; odchody[odchody_len++].t=-1; /* vytvoření příchodů a odchodů */ for (i=0;i<2*n;i++) if (udalosti[i].prichod) { int odchod=zakazky[udalosti[i].zakaznik].z + zakazky[udalosti[i].zakaznik].t; if (odchod > max_odchod) max_odchod=odchod; prichody[prichody_len++]=udalosti[i]; else /* odchod */ { odchody[odchody_len]=udalosti[i]; odchody[odchody_len++].t=max_odchod; /* ještě slít příchody a odchody do událostí */ prichody_len--; /* aby ukazoval ne za platný příchod, ale na něj */ odchody_len--; /* to samé s odchody */ i=2*n-1; /* index na konec pole udalostí, plníme ho zezadu */ while (prichody[prichody_len].t!=-1 odchody[odchody_len].t!=-1) if (prichody[prichody_len].t >= odchody[odchody_len].t) /* přidej příchod */ udalosti[i--]=prichody[prichody_len--]; else /* přidej odchod */ udalosti[i--]=odchody[odchody_len--]; int main(void) { int i; /* Načtení dat */ printf("zadejte počet zákazníků:"); scanf("%d",&n); for (i=0;i<n;i++) { printf("doba příchodu a čas praní %d. zákazníka:",i+1); scanf("%ld %ld",&zakazky[i].z,&zakazky[i].t); /* Vytvoření událostí */ for (i=0;i<n;i++) { /* příchod */ udalosti[2*i].t=zakazky[i].z; udalosti[2*i].prichod=1; udalosti[2*i].zakaznik=i; /* odchod */ udalosti[2*i+1].t=zakazky[i].z+zakazky[i].t; udalosti[2*i+1].prichod=0; udalosti[2*i+1].zakaznik=i; qsort(udalosti,2*n,sizeof(struct udalost),udalost_cmp); /* změna oproti domácímu kolu */ 2
3 uprav_udalosti(); /* simulace provozu */ for (i=0;i<2*n;i++) if (udalosti[i].prichod) { int pracka; if (!stack_top) /* nová pračka */ pracka=++pocet_pracek; else pracka=stack[--stack_top]; prirazeni_pracek[udalosti[i].zakaznik]=pracka; else /* odchod */ { stack[stack_top++]=prirazeni_pracek[udalosti[i].zakaznik]; /* vypsání dat */ printf("je třeba alespoň %d praček.\n",pocet_pracek); for (i=0;i<n;i++) printf("zákazník %d půjde k pračce %d.\n",i+1,prirazeni_pracek[i]); return 0; P-II-2 Zakázané rozdíly Nejdříve provedeme substituci x i = y i + a i,n+1 pro i, 1 i N, a x N+1 = y N+1. Například pro soustavu z prvního příkladu v zadání úlohy dostane po substituci: y 1 y 2 0 Pro soustavu z druhého příkladu dostaneme po substituci: y 1 y 3 0 y 1 y 4 0 y 2 y 3 1 y 2 y 4 0 y 3 y 4 0 y 1 y 2 2 = 0 (mod 2) y 1 y 3 0 y 2 y 3 0 Nově získaná soustava podmínek (nerovnic) má řešení právě tehdy, pokud ho měla ta původní: Když x i, 1 i N + 1, řeší původní soustavu, pak řešení nové soustavy nerovnic je y i = x i a i,n+1 pro i N a y N+1 = x N+1 ; naopak z řešení nové soustavy získáme řešení původní soustavu přičtením hodnot a i,n+1. Povšimněme si, že všechny nerovnosti, ve kterých se vyskytuje y N+1, mají pravou stranu rovnu 0 (po odečtení a i,n+1 od obou stran nerovnosti): x i x N+1 = (y i + a i,n+1 ) y N+1 = y i y N+1 + a i,n+1 a i,n+1. Podívejme se blíže na nově získanou soustavou nerovnic. Pokud jsou všechny pravé strany rovny nule, znamená to, že všechny neznámé y 1,..., y N+1 musí být navzájem různé. Protože ale existuje pouze N čísel s různými zbytky po dělení N, soustava nerovnic nemá řešení. Vzápětí ukážeme, že pokud nejsou všechny pravé strany rovny nule, pak nová soustava nerovnic, a tedy i ta původní mají řešení. Označme a i,j pravou stranu nerovnice, jejíž levá strana je y i y j. Předpokládejme, že a i,j 0 pro nějaké i a j. Protože a i,n+1 = 0 z volby y i, musí platit 1 i < j N. Položme y i = y j = 0. Protože a i,j 0, nerovnost y i y j a i,j je tím zjevně splněna. Nyní zvolíme hodnoty ostatních neznámých postupně od y 1 do y N, tak aby všechny nerovnosti, které je obsahují, byly splněny. V okamžiku, kdy volíme hodnotu neznámé y k, 1 k N, k i, j, tak se neznámá y k vyskytuje v nejvýše N 1 nerovnostech s ostatnimi neznámými, jejichž hodnotu jsme již zvolili. Protože každá nerovnost zakazuje přiřazení právě jednoho z čísel 0,..., N 1 neznámé y k, je dohromady zakázáno nejvýše N 2 hodnot a lze y k nějakou hodnotu přiřadit. Zbývá zvolit hodnotu y N+1. Po provedení naší substituce, byly pravé strany všech N nerovností, ve kterých se y N+1 vyskytuje rovny nule. Tedy hodnota y N+1 musí být různá od hodnot y 1,..., y N. Protože y i = y j, mají neznámé y 1,..., y N nejvýše N 1 různých hodnot, a proto lze y N+1 přiřadit (alespoň) jednu z hodnot 0,..., N 1. Naše dosavadní úvahy vedou přímočaře ke kvadratickému algoritmu, který řeší zadanou úlohu. Nejprve provedeme substituci popsanou v prvním odstavci. Pokud jsou všechny pravé strany po substituci rovny 0, nová i původní soustava nerovnic nemají řešení. V opačném případě nalezneme řešení nové soustavy nerovnic postupem popsaným v předchozích 3
4 dvou odstavcích. Řešení původní soustavy snadno získáme aplikací substituce inverzní k první provedené substituci. Časová i paměťová složitost našeho algoritmu je kvadratická v N, tj. O(N 2 ). program rozdily; const MAX=1000; var A: array[1..max,1..max] of integer; { pravé strany nerovností N: integer; { počet neznámých subst: array[1..max+1] of integer; { substituční posun y: array[1..max+1] of integer; { řešení nové soustavy procedure nacti; var i,j:integer; write( N = ); readln(n); for i:=1 to N+1 do for j:=i+1 to N+1 do write( a[,i,,,j, ] = ); readln(a[i][j]); procedure substituuj; var i,j:integer; for i:=1 to N do subst[i]:=a[i][n+1]; subst[n+1]:=0; for i:=1 to N+1 do for j:=i+1 to N+1 do A[i][j]:=(A[i][j]+subst[j]-subst[i]+N) mod N; function spocitej: boolean; var i,j,k,l:integer; { pomocné proměnné i, j a k jako v popisu algoritmu zakazane:array[0..max-1] of boolean; { pole zakazaných hodnot pro neznámou i:=1; while i<n do j:=i+1; while j<=n do if A[i][j]<>0 then break; inc(j) if j<=n then break; inc(i) if i=n then spocitej:=false; exit y[i]:=0; y[j]:=0; for k:=1 to N do if (k=i) or (k=j) then continue; for l:=0 to N-1 do zakazane[l]:=false; for l:=1 to k-1 do zakazane[(y[l]-a[l][k]+n) mod N]:=true; if i>k then zakazane[(y[i]+a[k][i]) mod N]:=true; if j>k then zakazane[(y[j]+a[k][j]) mod N]:=true; l:=0; while zakazane[l] do inc(l); 4
5 y[k]:=l for l:=0 to N-1 do zakazane[l]:=false; for l:=1 to N do zakazane[y[l]]:=true; l:=0; while zakazane[l] do inc(l); y[n+1]:=l; spocitej:=true procedure vypis; var i:integer; for i:=1 to N+1 do writeln( x[,i, ] =,(y[i]+subst[i]) mod N); nacti; substituuj; if spocitej then vypis else writeln( Zadaná soustava nerovnic nemá řešení. ); end. P-II-3 Redundantní redundance 1. řešení: Nejprve si ukážeme jednoduché řešení pracující v čase O(kn), založené na příhrádkovém třídění, zvaném též RadixSort či BucketSort. Jak takové třídění funguje? Pokud chceme setřídit m řetězců s 1,..., s m délky l, nejdříve je setřídíme podle posledního písmene, pak podle předposledního (přičemž pokud se předposlední písmeno shoduje, zachováme pořadí podle posledního písmene) atd. až podle prvního písmene. Třídění podle i-tého písmene (tomu budeme říkat jeden průchod) provádíme tak, že si založíme příhrádky indexované písmeny, jednotlivé řetězce (respektive jejich čísla) rozmístíme do příhrádek podle toho, jaké je jejich i-té písmeno, a nakonec příhrádky projdeme od nejmenšího písmene k největšímu a řetězce z nich vysbíráme. Každý průchod bude trvat O(m) [čas závisí i na velikosti abecedy, protože musíme projít i prázdné příhrádky, ale to pro nás bude konstanta, tudíž se schová do O-čka ], průchodů je l, takže celkem tříděním strávíme čas O(lm). Abychom vyřešili naši úlohu, nalezneme v zadaném řetězci všechny podřetězce délky k (těch je n k), setřídíme je RadixSortem a poté v setříděném seznamu najdeme nejdelší úsek tvořený stejnými podřetězci. Ovšem všimneme si, že si při třídění podřetězců nemusíme pamatovat celé podřetězce, ale stačí nám jejich začátky ve velkém řetězci. Takto vše zvládneme v čase O(kn) a prostoru O(n). Ještě jedna poznámka k implementaci: abychom zbytečně neplýtvali pamětí, neukládáme jednotlivé příhradky jako oddělená pole, ale všimneme si, že všechny příhrádky dohromady obsahují jen n prvků, takže je naskládáme do jednoho n-prvkového pole, jen si v druhém poli pamatujeme, kde která příhrádka začíná. Z vysbírání hodnot z příhrádek se pak stane jen zkopírování jednoho pole do druhého. program RedundancePoprve; const max=100; var T:string[max]; { Zadaný řetězec k:integer; { Jak dlouhé podřetězce hledáme n:integer; { Kolik existuje podřetězců délky k a,b:array [1..max] of integer; { Pole, které třídíme; pole s příhrádkami p:array [char] of integer; { Velikosti/začátky příhrádek i,j,l,maxcnt,maxpos:integer; { Pomocné proměnné c:char; readln(t); { Přečteme si vstup readln(k); n := length(t)-k+1; for i:=1 to n do { Všechny možné pozice podřetězců a[i] := i; for j:=k-1 downto 0 do { RadixSort; podle j-tého písmene for c:=#0 to #255 do { Spočteme velikosti příhrádek 5
6 p[c] := 0; for i:=1 to n do inc(p[t[a[i]+j]]); l := 1; { Spočteme jejich začátky for c:=#0 to #255 do l := l + p[c]; p[c] := l - p[c]; for i:=1 to n do { Rozdělíme do příhrádek c := T[a[i]+j]; b[p[c]] := a[i]; inc(p[c]); for i:=1 to n do { A opět z nich vybereme a[i] := b[i]; i := 1; { Hledáme nejdelší úsek maxcnt := 0; while i<=n do j := i; while (i<=n) and (copy(t,a[i],k) = copy(t,a[j],k)) do inc(i); if i-j > maxcnt then maxcnt := i-j; maxpos := a[j]; writeln(copy(t,maxpos,k)); { A vypíšeme výstup, hurá! writeln(maxcnt); end. 2. řešení: Existuje algoritmus řešící zadanou úlohu a pracující v čase O(n), kde n je délka textu T, je však poměrně komplikovaný. My si místo něj ukážeme o něco jednodušší randomizovaný algoritmus, tj. algoritmus používající při výpočtu náhodná čísla a pracující v čase O(n) alespoň v průměrném případě. Tím je míněno, že pokud budeme mít smůlu na to, jaká čísla nám padají z generátoru náhodných čísel, může to trvat i déle, nicméně ve většině případů nám (nezávisle na vstupních datech) dá výsledek v čase O(n). I toto řešení je dosti trikové a využívá netriviální výsledky. Nepředpokládáme samozřejmě, že byste tyto techniky měli znát či dokázat aktivně používat uvádíme ho spíše pro zajímavost a případně jako inspiraci pro hlubší zájemce o obor. Náš randomizovaný algoritmus bude fungovat tak, že nejprve řešení uhodne, ověří si, že uhodnuté řešení je opravdu správné, a pokud nebude, celý postup zopakuje. Takový algoritmus samozřejmě nemusí nikdy skončit, ale my si dokážeme, že uhodnuté řešení bude správné s pravděpodobnostní alespoň 1/2, takže v průměrném případě budeme potřebovat nejvýše 2 pokusy. Jak hádání, tak ověřování budou zabírat čas O(n), takže tuto časovou složitost bude mít v průměru i celý algoritmus. Nejprve si rozmysleme, že pokud uhodneme, že se nějaký řetězec délky k opakuje v textu l-krát, můžeme si snadno ověřit, že tomu tak skutečně je. K tomu použijeme řešení úlohy z domácího kola sestrojíme si vyhledávací automat pro tento podřetězec, projedeme s ním text a spočítáme počet jeho výskytů, tj. počet průchodů finálním stavem. To nám zabere čas O(n) v čase O(k) sestrojíme automat, v čase O(n) projedeme text automatem, a k < n. Fáze hádání funguje takto: Nejprve si zvolíme hashovací funkci. To je nějaká funkce h, zobrazující řetězce délky k na celá čísla mezi 0 a p 1 (hodnotu p si zvolíme později). Samozřejmě se nám může stát, že dva řetězce zobrazíme na stejné číslo (tomu se říká kolize), nicméně pokud bude hashovací funkce dobrá, nebude se to stávat často. Nyní každý podřetězec textu T délky k zobrazíme touto funkcí a spočítáme počty řetězců, které se zobrazí na jedno číslo. Z těchto počtů si vezmeme ten největší a vrátíme jeden z případně více řetězců, které se na příslušné číslo zobrazily. Pokud tento řetězec nekolidoval s žádným jiným, máme vyhráno, protože všechny ostatní řetězce (i když jsme některé kvůli kolizím nedokázali od sebe rozlišit) nejsou častější; pokud kolidoval, odhalí to kontrola. Zbývá domyslet detaily tak, abychom vše zvládli v lineárním čase: Nalezení nejčastější hodnoty hashovací funkce: Poslouží nám opět RadixSort: každé číslo si zapíšeme ve tvaru a 3 n 3 + a 2 n 2 + a 1 n + a 0, kde a i jsou menší než n (to není nic jiného, než zápis čísla v soustavě o základu n) a budeme ho třídit jako řetězec a 3 a 2 a 1 a 0 nad n-prvkovou abecedou. Jak už víme, RadixSort takové třídění zvládne v čase O(n). Počítání hashovací funkce musíme udělat šikovně (ve skutečnosti toto je hlavní trik celého řešení, zbytek jsou jen technické detaily), jinak bychom zde potřebovali čas nk nebo větší. Trik je v tom, že si zvolíme takovou hashovací funkci, abychom (pro w slovo délky k 1, s a t písmena) dokázali h(ws) spočítat se znalostí h(tw) v konstantním čase. Pak pokud budeme hashovací funkce podřetězců počítat postupně od začátku a posunovat se vždy o jedno písmeno, spotřebujeme skutečně čas jen O(n). 6
7 Hashovací funkci si zvolíme takto: p bude náhodně zvolené prvočíslo mezi kn 3 /2 a kn 3, ( k ) h(s k s k 1... s 1 ) = 256 i 1 s i mod p (předpokládáme, že abeceda [nebo spíše ASCIIbeceda] má 256 znaků). i=1 Výraz v závorce si označme X(s). X(s) samozřejmě může být větší než je rozsah čísla reprezentovaného v počítači, nicméně modulení p lze při jeho výpočtu provádět průběžně, takže nemůžeme přetéct. Postupné počítání funkce h je pak jednoduché, neboť zřejmě h(ws) = (256 h(tw) (256 k mod p)t + s) mod p. Je snadné nahlédnout, že pravděpodobnost, že dojde ke kolizi, je menší než 1/2: aby dvěma různým řetězcům s 1 a s 2 byla přiřazena stejná hodnota, musel by rozdíl X(s 1 ) X(s 2 ) být dělitelný p. Velikost tohoto rozdílu je nanejvýš 256 k, tedy ho dělí nanejvýš 8 log 2 k různých prvočísel (každé z nich má velikost alespoň 2 a kdyby jich bylo víc, jejich součin by musel být větší než 256 k ). Různých řetězců je nanejvýš n, tedy jejich dvojic je nanejvýš n 2 /2 a špatných prvočísel nanejvýš 4kn 2. Poměrně netriviální výsledek z teorie čísel nám říká, že počet prvočísel mezi kn 3 /2 a kn 3 kn je přibližně 3 2 log kn, tedy 3 8 log kn3 8 log n4 32 log n pravděpodobnost, že se trefíme do špatného prvočísla, je menší než n n = n, což je menší než 1/2 pro n 381 ve skutečnosti jsou uvedené odhady poměrně hrubé, takže tato pravděpodobnost je ještě podstatně menší. Zbývá jediný technický detail jak nalézt náhodné prvočíslo. To lze provést v čase O(log d n), kde d je nějaká konstanta, nicméně není to úplně triviální. Místo toho v programu volíme pouze náhodné číslo v daném intervalu; do prvočísla se trefíme s pravděpodobností přibližně 1/ log n, tedy časová složitost se tím zhorší nanejvýš na O(n log n). program RedundancePodruhe; const maxn = 1000; type pole = array[0..maxn] of longint; var t : string; k, l, nrep1, nrep2, idx, i : integer; p, v256nakmodp, highp, lowp : longint; { Spočítá počet výskytů řetězce začínajícího na pozici idx a uloží tuto hodnotu do nrep procedure Verify (idx : integer; var nrep : integer); var back : pole; f, i : integer; { spočítá zpětnou funkci pro řetězec od pozice idx f := 0; back[1] := 0; for i := 2 to k do while true do if t[idx + f] = t[idx + i - 1] then inc (f); break; if f = 0 then break; f := back[f]; back[i] := f; { spočítá počet výskytů řetězce f := 0; nrep := 0; for i := 1 to l do while true do if t[idx + f] = t[i] then inc (f); break; 7
8 if f = 0 then break; f := back[f]; if f = k then inc (nrep); f := back[f]; { Spočítá hashovací funkci pro začátek t function HashBegin : longint; var i : integer; h : longint; h := 0; for i := 1 to k do h := (256 * h + ord (t[i])) mod p; HashBegin := h; { Posune hashovací funkci h na pozici idx o 1 písmeno function HashShift (h : longint; idx : integer) : longint; var minus : longint; h := (h * 256) mod p; minus := (v256nakmodp * ord (t[idx])) mod p; HashShift := (h + p - minus + ord (t[idx+k])) mod p; { Vybere z a n-tou číslici function digit (a : longint; n : integer) : integer; var i : integer; for i := 1 to n do a := a div l; digit := a mod l; { Setřídí pole a délky m podle n-té číslice a výsledek uloží do sorted procedure SortByDigit (var a : pole; m, n : integer; var sorted : pole); var nreps : pole; i, d : integer; { spočítá pocty opakování for i := 0 to 2*l do nreps[i] := 0; for i := 1 to m do inc (nreps[digit (a[i], n) + 1]); { spočítá začátky úseků prvků for i := 1 to 2*l do nreps[i] := nreps[i - 1] + nreps[i]; { zapíše prvky na správné pozice for i := 1 to m do d := digit (a[i], n); inc (nreps[d]); sorted[nreps[d]] := a[i]; 8
9 { Setřídí pole a délky m a výsledek uloží do sorted procedure RadixSort (var a : pole; m : integer; var sorted : pole); var temp : pole; SortByDigit (a, m, 0, temp); SortByDigit (temp, m, 1, sorted); SortByDigit (sorted, m, 2, temp); SortByDigit (temp, m, 1, sorted); { Nalezne v poli a délky m číslo, které se v něm nejčastěji opakuje, počet opakování dá do nrep, číslo do v procedure MostCommon (var a : pole; m : integer; var v : longint; var nrep : integer); var sorted : pole; i, c : integer; RadixSort (a, m, sorted); v := sorted[1]; c := 1; nrep := 1; for i := 2 to m do if sorted[i] = sorted[i - 1] then inc(c) else c := 1; if c > nrep then v := sorted[i]; nrep := c; { "Uhodne" podřetězec, který se v T vyskytuje nejčastěji. Počet výskytů uloží do nrep, začátek prvního výskytu do idx procedure Guess (var idx : integer; var nrep : integer); var hashvals : pole; i : integer; v : longint; hashvals[1] := hashbegin; for i := 1 to l - k do hashvals[i + 1] := HashShift (hashvals[i], i); MostCommon (hashvals, l - k + 1, v, nrep); for i := 1 to l - k + 1 do if hashvals[i] = v then idx := i; break; { Hlavní program readln (k); readln (t); l := length (t); highp := l * l * l * k; lowp := highp div 2; repeat p := random (highp - lowp) + lowp; 9
10 v256nakmodp := 1; for i := 1 to k do v256nakmodp := (256 * v256nakmodp) mod p; Guess (idx, nrep1); Verify (idx, nrep2); until nrep1 = nrep2; writeln (nrep1); for i := idx to idx + k - 1 do write (t[i]); writeln; end. P-II-4 ALÍK Tuto úlohu bychom mohli řešit podobně jako úlohy z minulého kola v čase O(log N) s O(N)-bitovými čísly stačí si všimnout, že otočení čísla délky N lze provést prohozením jeho polovin (což zvládneme na konstantní počet operací) a následným otočením obou polovin (což můžeme udělat současně). Pro N = 8 by to vypadalo takto: x = x 7 x 6 x 5 x 4 x 3 x 2 x 1 x 0 a := x a = x 7 x 6 x 5 x b := x b = x 3 x 2 x 1 x 0 y := (a >> 4) (b << 4) y = x 3 x 2 x 1 x 0 x 7 x 6 x 5 x 4 a := y a = x 3 x x 7 x b := y b = 0 0 x 1 x x 5 x 4 y := (a >> 2) (b << 2) y = x 1 x 0 x 3 x 2 x 5 x 4 x 7 x 6 a := y a = x 1 0 x 3 0 x 5 0 x 7 0 b := y b = 0 x 0 0 x 2 0 x 4 0 x 6 y := (a >> 1) (b << 1) y = x 0 x 1 x 2 x 3 x 4 x 5 x 6 x 7 Ovšem pokud využijeme násobení a dělení, zvládneme totéž na konstantní počet operací, i když, pravda, budeme potřebovat čísla délky O(N 2 ). Náš algoritmus bude založen na tom, že zadané číslo x = x N 1... x 0 nejprve N-krát zkopírujeme (to lze provést násobením), pak i-tou kopii nahradíme číslem, které bude na i-tém místě obsahovat x N 1 i a všude jinde nuly, načež všechny kopie sečteme (k tomu lze opět použít násobení, ale my si ukážeme pěkný trik se zbytkem po dělení). Kopírování provedeme takto: číslo x vynásobíme číslem (0 N 1 1) N+1, čímž získáme (x N 1... x 0 ) N+1, čili N + 1 kopií zadaného čísla. Tento výsledek si ale také můžeme představit rozdělený na N úseků délky N +1: nejnižší úsek bude obsahovat číslice x 0 x N 1... x 0, ten nad ním x 1 x 0 x N 1... x 1 atd. Tedy i-tý úsek zespoda (počítáno od nuly) bude mít na nejnižším místě x i. Nyní každý úsek vyplníme hodnotou jeho nejnižšího bitu. K tomu stačí úsek upravit do tvaru 10 N 1 x i (použijeme a ) a odečíst od něj jedničku. Pokud x i bylo 1, vyjde 10 N, jinak dojde k přenosu a dostaneme 01 N. V každém případě se na nejvyšším místě objeví x i a na ostatních x i, což jedním xorem opravíme na x i všude. Navíc nemohlo dojít k přenosu mimo úsek, takže se úseky navzájem neovlivňují, a tudíž tuto operaci můžeme provést pro všechny současně. Nyní stačí vhodným andováním v každém úseku ponechat x i na pozici, na které má ve výsledku skončit, ostatní výskyty x i vynulovat a všechny úseky sečíst. Sečtení můžeme provést pěkným trikem: pokud máme v registru r uloženo číslo tvaru t 1... t z, kde t i jsou k-bitová čísla, a spočteme r %(2 k 1), vyjde (t t z ) %(2 k 1). V našem případě navíc víme, že t t z < 2 k 1, protože sčítáme (N + 1)-bitové úseky s N-bitovým výsledkem, a tak se modulo na výsledku neprojeví a dostaneme přímo hledaný součet. Proč modulo 2 k 1 funguje jako součet bloků, můžeme nahlédnout z toho, jak by se choval školní algoritmus pro dělení čísel na papíře, ale také to můžeme snadno dokázat indukcí: pro z = 1 trik určitě funguje; když už víme, že funguje pro z 1 a chceme dokázat, že funguje i pro z, všimneme si, že: t 1... t z %(2 k 1) = ( (t 1... t z 1 ) 2 k ) + t z %(2 k 1) = ( (t1 =... t z 1 %(2 k 1) ) (2 k %(2 k 1) ) ) +t z %(2 k 1), {{{{ indukční předpoklad = 1 což dá dohromady (t t z ) %(2 k 1), přesně, jak jsme chtěli. Ke všem výpočtům jsme potřebovali registry délky N (N + 1) = O(N 2 ). Operací bylo dohromady konstantně mnoho. Zbývá už jen program: x = x N 1... x 0 y := x (0 N 1 1) N+1 y = (x N 1... x 0 ) N+1 = (x N 1... x 0 x N 1 )... (x 1 x 0 x N 1... x 1 )(x 0 x N 1... x 0 ) y := y (0 N 1) N y = (0 N x N 1 )... (0 N x 1 )(0 N x 0 ) 10
11 y := y (10 N ) N y = (10 N 1 x N 1 )... (10 N 1 x 1 )(10 N 1 x 0 ) y := y (0 N 1) N y = (x N 1 ( x N 1 ) N )... (x 0 ( x 0 ) N ) y := y (01 N ) N y = (x N+1 N 1 )... (xn+1 0 ) y := y (0 N 1)(0 N 1 10)... (010 N 1 ) y = (0 N x N 1 )(0 N 1 x N 2 0)... (00x 1 0 N 2 )(0x 0 0 N 1 ) y := y % 1 N+1 y = 0x 0 x 1... x N 1 11
V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2
Euklidův algoritmus Doprovodný materiál pro cvičení Programování I. NPRM044 Autor: Markéta Popelová Datum: 31.10.2010 Euklidův algoritmus verze 1.0 Zadání: Určete největšího společného dělitele dvou zadaných
Programovací jazyk Pascal
Programovací jazyk Pascal Syntaktická pravidla (syntaxe jazyka) přesná pravidla pro zápis příkazů Sémantická pravidla (sémantika jazyka) pravidla, která každému příkazu přiřadí přesný význam Všechny konstrukce
Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.
Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 21. září 2018 Jiří Dvorský (VŠB TUO) Vyhledávání 242 / 433 Osnova přednášky
68. ročník Matematické olympiády 2018/2019
68. ročník Matematické olympiády 2018/2019 Řešení úloh ústředního kola kategorie P 2. soutěžní den P-III-4 Výlet Abychom našli požadovaný výlet délky 4, stačí najít dvě hvězdy a a b, které mají dva společné
NPRG030 Programování I, 2018/19 1 / :03:07
NPRG030 Programování I, 2018/19 1 / 20 3. 12. 2018 09:03:07 Vnitřní třídění Zadání: Uspořádejte pole délky N podle hodnot prvků Měřítko efektivity: * počet porovnání * počet přesunů NPRG030 Programování
Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem
Test prvočíselnosti Úkol: otestovat dané číslo N, zda je prvočíslem 1. zkusit všechny dělitele od 2 do N-1 časová složitost O(N) cca N testů 2. stačí zkoušet všechny dělitele od 2 do N/2 (větší dělitel
- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku
Znaky - standardní typ char var Z, W: char; - znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku - v TP (často i jinde) se používá kódová
Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012
Obecná informatika Přednášející Putovních přednášek Matematicko-fyzikální fakulta Univerzity Karlovy v Praze Podzim 2012 Přednášející Putovních přednášek (MFF UK) Obecná informatika Podzim 2012 1 / 18
Základy algoritmizace a programování
Základy algoritmizace a programování Složitost algoritmů. Třídění Přednáška 8 16. listopadu 2009 Který algoritmus je "lepší"? Různé algoritmy, které řeší stejnou úlohu zbytek = p % i; zbytek = p - p/i*i;
Digitální učební materiál
Digitální učební materiál Číslo projektu: CZ.1.07/1.5.00/34.0548 Název školy: Gymnázium, Trutnov, Jiráskovo náměstí 325 Název materiálu: VY_32_INOVACE_145_IVT Autor: Ing. Pavel Bezděk Tematický okruh:
Hledání v textu algoritmem Boyer Moore
Zápočtová práce z Algoritmů a Datových Struktur II (NTIN061) Hledání v textu algoritmem Boyer Moore David Pěgřímek http://davpe.net Algoritmus Boyer Moore[1] slouží k vyhledání vzoru V v zadaném textu
Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010
Dynamické programování Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Rozděl a panuj (divide-and-conquer) Rozděl (Divide): Rozděl problém na několik podproblémů tak, aby tyto podproblémy odpovídaly původnímu
1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1
1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1 1. Prvocisla: Kratky ukazkovy priklad na demonstraci baliku WEB. Nasledujici program slouzi pouze jako ukazka nekterych moznosti a sluzeb,
M - Příprava na 1. zápočtový test - třída 3SA
M - Příprava na 1. zápočtový test - třída 3SA Autor: Mgr. Jaromír JUŘEK Kopírování a jakékoliv další využití výukového materiálu je povoleno pouze s uvedením odkazu na www.jarjurek.cz. VARIACE 1 Tento
Univerzita Karlova v Praze Pedagogická fakulta
Univerzita Karlova v Praze Pedagogická fakulta SEMINÁRNÍ PRÁCE Z METOD ŘEŠENÍ 1 TEORIE ČÍSEL 000/001 Cifrik, M-ZT Příklad ze zadávacích listů 10 101 Dokažte, že číslo 101 +10 je dělitelné číslem 51 Důkaz:
1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5
Obsah Obsah 1 Programovací jazyk Pascal 1 1.1 Struktura programu v Pascalu.................... 1 2 Proměnné 2 2.1 Vstup a výstup............................ 3 3 Operátory a některé matematické funkce 5
Obsah. Euler-Fermatova věta. Reziduální aritmetika. 3. a 4. přednáška z kryptografie
Obsah Počítání modulo n a jeho časová složitost 3. a 4. přednáška z kryptografie 1 Počítání modulo n - dokončení Umocňování v Zn 2 Časová složitost výpočtů modulo n Asymptotická notace Základní aritmetické
M - Příprava na pololetní písemku č. 1
M - Příprava na pololetní písemku č. 1 Určeno pro třídy 3SA, 3SB. VARIACE 1 Tento dokument byl kompletně vytvořen, sestaven a vytištěn v programu dosystem - EduBase. Více informací o programu naleznete
M - Kvadratické rovnice a kvadratické nerovnice
M - Kvadratické rovnice a kvadratické nerovnice Určeno jako učební tet pro studenty dálkového studia. VARIACE 1 Tento dokument byl kompletně vytvořen, sestaven a vytištěn v programu dosystem - EduBase.
Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.
Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 12. září 2016 Jiří Dvorský (VŠB TUO) Vyhledávání 201 / 344 Osnova přednášky
Řešení úloh z TSP MU SADY S 1
Řešení úloh z TSP MU SADY S 1 projekt RESENI-TSP.CZ úlohy jsou vybírány z dříve použitých TSP MU autoři řešení jsou zkušení lektoři vzdělávací agentury Kurzy-Fido.cz Masarykova univerzita nabízí uchazečům
Soustavy rovnic pro učební obory
Variace 1 Soustavy rovnic pro učební obory Autor: Mgr. Jaromír JUŘEK Kopírování a jakékoliv další využití výukového materiálu je povoleno pouze s uvedením odkazu na www.jarjurek.cz. 1. Soustavy rovnic
Závěrečná zkouška z informatiky 2011
Závěrečná zkouška z informatiky 2011 1) Číslo A je v dvojkové soustavě a má hodnotu 1101011. Číslo B je v šestnáctkové soustavě a má hodnotu FF3. Vypočítejte : A * B a výsledek napište v desítkové soustavě.
NPRG030 Programování I, 2017/18 1 / :22:16
NPRG030 Programování I, 2017/18 1 / 26 20. 10. 2017 11:22:16 Ordinální typy standardní: integer, char, boolean Vlastnosti ordinálních typů: 1. hodnot je konečný počet a hodnoty jsou uspořádány 2. ke každé
Algoritmizace a programování
Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech
Anotace. Ordinalni typy - typ char, funkce ord, chr, succ, prev, inc, dec,
Anotace Ordinalni typy - typ char, funkce ord, chr, succ, prev, inc, dec, Motivace: Máme dlouhé číslo (nebo číslo ve stringu). Zapis cisla v pozicni soustave, jeho vyhodnoceni Hornerovym schematem, Evaluace
VYBRANÉ PARTIE Z NUMERICKÉ MATEMATIKY
VYBRANÉ PARTIE Z NUMERICKÉ MATEMATIKY Jan Krejčí 31. srpna 2006 jkrejci@physics.ujep.cz http://physics.ujep.cz/~jkrejci Obsah 1 Přímé metody řešení soustav lineárních rovnic 3 1.1 Gaussova eliminace...............................
57. ročník Matematické olympiády 2007/2008
57. ročník Matematické olympiády 2007/200 Řešení úloh domácího kola kategorie P P-I-1 O zdánlivém kopci Úkolem je vybrat ze zadané posloupnosti co nejdelší podposloupnost, která by nejprve rostla a potom
68. ročník Matematické olympiády 2018/2019
68. ročník Matematické olympiády 2018/2019 Řešení úloh ústředního kola kategorie P 1. soutěžní den P-III-1 Půl království Pokud v hledané polorovině neleží všechny zadané body, můžeme bez újmy na obecnosti
54. ročník Matematické olympiády 2004/2005
54. ročník Matematické olympiády 2004/2005 Komentáře k úlohám domácího kola kategorie P P-I-1 Prádelna Nejprve se zaměřme na to, kolika pračkami bude potřeba vybavit prádelnu. Je zřejmé, že je potřeba
68. ročník Matematické olympiády 2018/2019
68. ročník Matematické olympiády 2018/2019 Řešení úloh krajského kola kategorie P P-II-1 Tulipány Budeme řešit o něco obecnější úlohu: dovolíme si předepsat, zda má na n-té pozici být tulipán, a pokud
Digitální učební materiál
Digitální učební materiál Číslo projektu: CZ.1.07/1.5.00/34.0548 Název školy: Gymnázium, Trutnov, Jiráskovo náměstí 325 Název materiálu: VY_32_INOVACE_149_IVT Autor: Ing. Pavel Bezděk Tematický okruh:
Binární soubory (datové, typované)
Binární soubory (datové, typované) - na rozdíl od textových souborů data uložena binárně (ve vnitřním tvaru jako v proměnných programu) není čitelné pro člověka - všechny záznamy téhož typu (může být i
Základy algoritmizace. Pattern matching
Základy algoritmizace Pattern matching 1 Pattern matching Úloha nalézt v nějakém textu výskyty zadaných textových vzorků patří v počítačové praxi k nejfrekventovanějším. Algoritmy, které ji řeší se používají
4 Stromy a les. Definice a základní vlastnosti stromů. Kostry grafů a jejich počet.
4 Stromy a les Jedním ze základních, a patrně nejjednodušším, typem grafů jsou takzvané stromy. Jedná se o souvislé grafy bez kružnic. Přes svou (zdánlivou) jednoduchost mají stromy bohatou strukturu a
12. Lineární programování
. Lineární programování. Lineární programování Úloha lineárního programování (lineární optimalizace) je jedním ze základních problémů teorie optimalizace. Našim cílem je nalézt maximum (resp. minimum)
Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7
Pascal Katedra aplikované kybernetiky Ing. Miroslav Vavroušek Verze 7 Proměnné Proměnná uchovává nějakou informaci potřebnou pro práci programu. Má ve svém oboru platnosti unikátní jméno. (Připadne, musí
Soustavy rovnic pro učební obor Kadeřník
Variace 1 Soustavy rovnic pro učební obor Kadeřník Autor: Mgr. Jaromír JUŘEK Kopírování a jakékoliv další využití výukového materiálu je povoleno pouze s uvedením odkazu na www.jarjurek.cz. 1. Soustavy
NPRG030 Programování I, 2010/11
Podmínka = něco, co JE, nebo NENÍ splněno typ Boolean hodnoty: TRUE pravda FALSE lež domluva (optimistická): FALSE < TRUE když X, Y jsou (číselné) výrazy, potom X = Y X Y X < Y X > Y X = Y jsou
Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky
Vyučovací hodina 1vyučovací hodina: Opakování z minulé hodiny Nová látka Procvičení nové látky Shrnutí 5 min 20 min 15 min 5 min 2vyučovací hodiny: Opakování z minulé hodiny Nová látka Procvičení nové
53. ročník Matematické olympiády 2003/2004
53. ročník Matematické olympiády 2003/2004 Řešení úloh krajského kola kategorie P P-II-1 Síť Zadanou úlohu si převedeme do řeči teorie grafů. Budovy firmy představují vrcholy našeho grafu, hrany grafu
Digitální učební materiál
Digitální učební materiál Číslo projektu: CZ.1.07/1.5.00/34.0548 Název školy: Gymnázium, Trutnov, Jiráskovo náměstí 325 Název materiálu: VY_32_INOVACE_147_IVT Autor: Ing. Pavel Bezděk Tematický okruh:
Digitální učební materiál
Digitální učební materiál Číslo projektu: CZ.1.07/1.5.00/34.0548 Název školy: Gymnázium, Trutnov, Jiráskovo náměstí 325 Název materiálu: VY_32_INOVACE_156_IVT Autor: Ing. Pavel Bezděk Tematický okruh:
Lineární spojový seznam (úvod do dynamických datových struktur)
Lineární spojový seznam (úvod do dynamických datových struktur) Jan Hnilica Počítačové modelování 11 1 Dynamické datové struktury Definice dynamické struktury jsou vytvářeny za běhu programu z dynamicky
Zpracoval: hypspave@fel.cvut.cz 7. Matematická indukce a rekurse. Řešení rekurentních (diferenčních) rovnic s konstantními koeficienty.
Zpracoval: hypspave@fel.cvut.cz 7. Matematická indukce a rekurse. Řešení rekurentních (diferenčních) rovnic s konstantními koeficienty. (A7B01MCS) I. Matematická indukce a rekurse. Indukční principy patří
Časová a prostorová složitost algoritmů
.. Časová a prostorová složitost algoritmů Programovací techniky doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Hodnocení algoritmů Programovací techniky Časová a prostorová
NPRG030 Programování I, 2016/17 1 / :58:13
NPRG030 Programování I, 2016/17 1 / 31 10. 10. 2016 10:58:13 Podmínka = něco, co JE, nebo NENÍ splněno typ Boolean hodnoty: TRUE pravda FALSE lež domluva (optimistická): FALSE < TRUE NPRG030 Programování
Základy algoritmizace. Hašování
Základy algoritmizace Hašování Problematika hašování Hašování - nástroj na jednoduchý způsob "zakódování vstupních dat. Vstupní data jsou zpracována hašovací funkcí jsou jistým způsobem komprimována. Relativně
Programy na PODMÍNĚNÝ příkaz IF a CASE
Vstupy a výstupy budou vždy upraveny tak, aby bylo zřejmé, co zadáváme a co se zobrazuje. Není-li určeno, zadáváme přirozená čísla. Je-li to možné, používej generátor náhodných čísel vysvětli, co a jak
Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague
1 / 23 Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague 2 / 23 biologové často potřebují najít často se opakující sekvence DNA tyto sekvence bývají relativně krátké,
Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.
Kapitola Reprezentace grafu V kapitole?? jsme se dozvěděli, co to jsou grafy a k čemu jsou dobré. rzo budeme chtít napsat nějaký program, který s grafy pracuje. le jak si takový graf uložit do počítače?
1. D Y N A M I C K É DAT O V É STRUKTUR Y
1. D Y N A M I C K É DAT O V É STRUKTUR Y Autor: Petr Mik Abychom se mohli pustit do dynamických datových struktur, musíme se nejdřív podívat na datový typ ukazatel. 1. D AT O V Ý TYP U K A Z AT E L Datové
Řešení 1b Máme najít body, v nichž má funkce (, ) vázané extrémy, případně vázané lokální extrémy s podmínkou (, )=0, je-li: (, )= +,
Příklad 1 Najděte body, v nichž má funkce (,) vázané extrémy, případně vázané lokální extrémy s podmínkou (,)=0, je-li: a) (,)= + 1, (,)=+ 1 lok.max.v 1 2,3 2 b) (,)=+, (,)= 1 +1 1 c) (,)=, (,)=+ 1 lok.max.v
64. ročník matematické olympiády Řešení úloh krajského kola kategorie A
64. ročník matematické olympiády Řešení úloh krajského kola kategorie A 1. Středy stran AC, BC označme postupně, N. Střed kružnice vepsané trojúhelníku KLC označme I. Úvodem poznamenejme, že body K, L
Standardní algoritmy vyhledávací.
Standardní algoritmy vyhledávací. Vyhledávací algoritmy v C++ nám umožňují vyhledávat prvky v datových kontejnerech podle různých kritérií. Také se podíváme na vyhledávání metodou půlením intervalu (binární
DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3
DobSort Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 V roce 1980 navrhl Dobosiewicz variantu (tzv. DobSort),
Dosud jsme se zabývali pouze soustavami lineárních rovnic s reálnými koeficienty.
Kapitola 4 Tělesa Dosud jsme se zabývali pouze soustavami lineárních rovnic s reálnými koeficienty. Všechna čísla byla reálná, vektory měly reálné souřadnice, matice měly reálné prvky. Také řešení soustav
VZOROVÝ TEST PRO 1. ROČNÍK (1. A, 3. C)
VZOROVÝ TEST PRO. ROČNÍK (. A, 3. C) Zjednodušte daný příklad. (a 2 3 b 3 4) 2 (a 2 b 3 8) 3 max. 3 body 2 Ve které z následujících možností je uveden správný postup usměrnění daného zlomku a správný výsledek?
Anotace. Informace o praktiku z programování!!! Direktivy překladače Soubory (textové) Quicksort Metoda rozděl a panuj
Anotace Informace o praktiku z programování!!! Direktivy překladače Soubory (textové) Quicksort Metoda rozděl a panuj Direktivy překladače Překladač kontroluje plno věcí, například: zda nekoukáme za konec
Úvod do programování 6. hodina
Úvod do programování 6. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015 Umíme z minulé hodiny Algoritmy Třídění pole: Selection
Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b
Výrazy a operátory i = 2 i = 2; to je výraz to je příkaz 4. Operátory Unární - unární a unární + Např.: +5-5 -8.345 -a +b - unární ++ - inkrement - zvýší hodnotu proměnné o 1 - unární -- - dekrement -
- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku
Znaky - standardní typ char var Z, W: char; - znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku - v TP (často i jinde) se používá kódová
INFORMATIKA. Vybrané podposloupnosti
INFORMATIKA Vybrané podposloupnosti (Úlohy z MO kategorie P, 30. část) PAVEL TÖPFER Matematicko-fyzikální fakulta UK, Praha V našem seriálu putujícím po zajímavých úlohách Matematické olympiády - kategorie
Poslední nenulová číslice faktoriálu
Poslední nenulová číslice faktoriálu Kateřina Bambušková BAM015, I206 Abstrakt V tomto článku je popsán a vyřešen problém s určením poslední nenulové číslice faktoriálu přirozeného čísla N. Celý princip
12. cvičení z PST. 20. prosince 2017
1 cvičení z PST 0 prosince 017 11 test rozptylu normálního rozdělení Do laboratoře bylo odesláno n = 5 stejných vzorků krve ke stanovení obsahu alkoholu X v promilích alkoholu Výsledkem byla realizace
CVIČNÝ TEST 15. OBSAH I. Cvičný test 2. Mgr. Tomáš Kotler. II. Autorské řešení 6 III. Klíč 15 IV. Záznamový list 17
CVIČNÝ TEST 15 Mgr. Tomáš Kotler OBSAH I. Cvičný test 2 II. Autorské řešení 6 III. Klíč 15 IV. Záznamový list 17 I. CVIČNÝ TEST VÝCHOZÍ TEXT K ÚLOZE 1 Je dána čtvercová mřížka, v níž každý čtverec má délku
Binární vyhledávací stromy pokročilé partie
Binární vyhledávací stromy pokročilé partie KMI/ALS lekce Jan Konečný 30.9.204 Literatura Cormen Thomas H., Introduction to Algorithms, 2nd edition MIT Press, 200. ISBN 0-262-5396-8 6, 3, A Knuth Donald
Generování pseudonáhodných. Ing. Michal Dorda, Ph.D.
Generování pseudonáhodných čísel při simulaci Ing. Michal Dorda, Ph.D. 1 Úvodní poznámky V simulačních modelech se velice často vyskytují náhodné proměnné. Proto se budeme zabývat otázkou, jak při simulaci
Už známe datové typy pro representaci celých čísel i typy pro representaci
Dlouhá čísla Tomáš Holan, dlouha.txt, Verse: 19. února 2006. Už známe datové typy pro representaci celých čísel i typy pro representaci desetinných čísel. Co ale dělat, když nám žádný z dostupných datových
(Úlohy z MO kategorie P, 32. část)
Rozklady na součet (Úlohy z MO kategorie P, 32. část) PAVEL TÖPFER Matematicko-fyzikální fakulta UK, Praha Náš dlouhodobý seriál o úlohách z Matematické olympiády kategorie P se dnes zastaví ve 39. ročníku
Úlohy klauzurní části školního kola kategorie A
6. ročník matematické olympiády Úlohy klauzurní části školního kola kategorie A. V oboru reálných čísel řešte soustavu rovnic y + 3x = 4x 3, x + 3y = 4y 3. 2. V rovině uvažujme lichoběžník ABCD se základnami
Lineární funkce, rovnice a nerovnice 4 lineární nerovnice
Lineární funkce, rovnice a nerovnice 4 lineární nerovnice 4.1 ekvivalentní úpravy Při řešení lineárních nerovnic používáme ekvivalentní úpravy (tyto úpravy nijak neovlivní výsledek řešení). Jsou to především
Složitost algoritmů. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava
Složitost algoritmů doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 27. prosince 2015 Jiří Dvorský (VŠB TUO) Složitost algoritmů
13. cvičení z PSI ledna 2017
cvičení z PSI - 7 ledna 07 Asymptotické pravděpodobnosti stavů Najděte asymptotické pravděpodobnosti stavů Markovova řetězce s maticí přechodu / / / 0 P / / 0 / 0 0 0 0 0 0 jestliže počáteční stav je Řešení:
Potřebovali bychom tedy umět do heše přidávat nové hodnoty, najít hodnotu pro
Hešování (V literatuře se také často setkáme s jinými přepisy tohoto anglicko-českého patvaru (hashování), či více či méně zdařilými pokusy se tomuto slovu zcela vyhnout a místo heš používat například
Algoritmy I, složitost
A0B36PRI - PROGRAMOVÁNÍ Algoritmy I, složitost České vysoké učení technické Fakulta elektrotechnická v 1.01 Rychlost... Jeden algoritmus (program, postup, metoda ) je rychlejší než druhý. Co ta věta znamená??
Třídění a vyhledávání Searching and sorting
Třídění a vyhledávání Searching and sorting Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 1 / 33 Vyhledávání Třídění Třídící algoritmy 2 / 33 Vyhledávání Searching Mějme posloupnost (pole)
Maticí typu (m, n), kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru:
3 Maticový počet 3.1 Zavedení pojmu matice Maticí typu (m, n, kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru: a 11 a 12... a 1k... a 1n a 21 a 22...
(4x) 5 + 7y = 14, (2y) 5 (3x) 7 = 74,
1. V oboru celých čísel řešte soustavu rovnic (4x) 5 + 7y = 14, (2y) 5 (3x) 7 = 74, kde (n) k značí násobek čísla k nejbližší číslu n. (P. Černek) Řešení. Z první rovnice dané soustavy plyne, že číslo
Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A
Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A Každá úloha je hodnocena maximálně 25 body. Všechny své odpovědi zdůvodněte! 1. Postavte na stůl do řady vedle
V předchozí kapitole jsme podstatným způsobem rozšířili naši představu o tom, co je to číslo. Nadále jsou pro nás důležité především vlastnosti
Kapitola 5 Vektorové prostory V předchozí kapitole jsme podstatným způsobem rozšířili naši představu o tom, co je to číslo. Nadále jsou pro nás důležité především vlastnosti operací sčítání a násobení
Lomené výrazy sčítání a odčítání lomených výrazů
VY_32_INOVACE_M-Ar 8.,9.15 Lomené výrazy sčítání a odčítání lomených výrazů Anotace: Prezentace připomene sčítání a odčítání zlomků. Žák použije poznatky zopakované při počítání se zlomky u zjišťování
Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:
Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury
Vektorové podprostory, lineární nezávislost, báze, dimenze a souřadnice
Vektorové podprostory, lineární nezávislost, báze, dimenze a souřadnice Vektorové podprostory K množina reálných nebo komplexních čísel, U vektorový prostor nad K. Lineární kombinace vektorů u 1, u 2,...,u
57. ročník Matematické olympiády 2007/2008
57. ročník Matematické olympiády 2007/2008 Řešení úloh ústředního kola kategorie P 1. soutěžní den P-III-1 Karpaty Jedním z nejjednodušších(a také nejpomalejších) způsobů, jak úlohu řešit, je projít postupně
Základní datové struktury III: Stromy, haldy
Základní datové struktury III: Stromy, haldy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní
Implementace LL(1) překladů
Překladače, přednáška č. 6 Ústav informatiky, FPF SU Opava sarka.vavreckova@fpf.slu.cz Poslední aktualizace: 30. října 2007 Postup Programujeme syntaktickou analýzu: 1 Navrhneme vhodnou LL(1) gramatiku
Věta o dělení polynomů se zbytkem
Věta o dělení polynomů se zbytkem Věta. Nechť R je okruh, f, g R[x], přičemž vedoucí koeficient polynomu g 0 je jednotka okruhu R. Pak existuje jediná dvojice polynomů q, r R[x] taková, že st(r) < st(g)
Rozděl a panuj. Často se setkáme s úlohami, které lze snadno rozdělit na nějaké menší úlohy a z jejich
Rozděl a panuj Často se setkáme s úlohami, které lze snadno rozdělit na nějaké menší úlohy a z jejich výsledků zase snadno složit výsledek původní velké úlohy. Přitom menší úlohy můžeme řešit opět týmž
Jednoduchá exponenciální rovnice
Jednoduchá exponenciální rovnice Z běžné rovnice se exponenciální stává, pokud obsahuje proměnnou v exponentu. Obecně bychom mohli exponenciální rovnici zapsat takto: a f(x) = b g(x), kde a, b > 0. Typickým
Algoritmus pro generování normálních magických čtverců
1.1 Úvod Algoritmus pro generování normálních magických čtverců Naprogramoval jsem v Matlabu funkci, která dokáže vypočítat magický čtverec libovolného přípustného rozměru. Za pomocí tří algoritmů, které
Lineární funkce, rovnice a nerovnice 3 Soustavy lineárních rovnic
Lineární funkce, rovnice a nerovnice Soustavy lineárních rovnic motivace Využívají se napřklad při analytickém vyšetřování vzájemné polohy dvou přímek v rovině a prostoru. Při řešení některých slovních
( ) ( ) Logaritmické nerovnice II. Předpoklady: 2924
5 Logaritmické nerovnice II Předpoklad: Pedagogická poznámka: Většina studentů spočítá pouze první tři příklad, nejlepší se dostanou až k pátému Pedagogická poznámka: U následujících dvou příkladů je opět
Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz
Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz (2 + 5) * (13-4) * + - 2 5 13 4 - listy stromu obsahují operandy (čísla) - vnitřní uzly obsahují operátory (znaménka)
Elegantní algoritmus pro konstrukci sufixových polí
Elegantní algoritmus pro konstrukci sufixových polí 22.10.2014 Zadání Obsah Zadání... 3 Definice... 3 Analýza problému... 4 Jednotlivé algoritmy... 4 Algoritmus SA1... 4 Algoritmus SA2... 5 Algoritmus
Úvod do programování
Úvod do programování Základní literatura Töpfer, P.: Algoritmy a programovací techniky, Prometheus, Praha učebnice algoritmů, nikoli jazyka pokrývá velkou část probíraných algoritmů Satrapa, P.: Pascal
58. ročník Matematické olympiády 2008/2009
58. ročník Matematické olympiády 2008/2009 Řešení úloh krajského kola kategorie P P-II-1 Lesník Jehlička Intuitivně se zdá, že počet mřížových bodů uvnitř mnohoúhelníka by měl být úměrný jeho obsahu. A
Logaritmická rovnice
Ročník:. Logaritmická rovnice (čteme: logaritmus z x o základu a) a základ logaritmu x argument logaritmu Vzorce Použití vzorců a principy počítání s logaritmy jsou stejné jako u logaritmů základních,
Algoritmus pro hledání nejkratší cesty orientovaným grafem
1.1 Úvod Algoritmus pro hledání nejkratší cesty orientovaným grafem Naprogramoval jsem v Matlabu funkci, která dokáže určit nejkratší cestu v orientovaném grafu mezi libovolnými dvěma vrcholy. Nastudoval
Soustavy linea rnı ch rovnic
[1] Soustavy lineárních rovnic vlastnosti množin řešení metody hledání řešení nejednoznačnost zápisu řešení a) soustavy, 10, b) P. Olšák, FEL ČVUT, c) P. Olšák 2010, d) BI-LIN, e) L, f) 2009/2010, g)l.