Diferente pentru happy-coding-2007/solutii intre reviziile #6 si #7

Nu exista diferente intre titluri.

Diferente intre continut:

h3. Algoritm de complexitate $O(log N)$ - varianta 2
Vom calcula o matrice $T[x][i][y]$ = numarul de siruri de tritzi (mod P), de lungime $2^i^$ si pentru care primul trit are valoarea $x$, iar ultimul trit are valoarea $y$. $T[x][0][y]$ se determina direct, iar pentru $i > 0$, $T[x][i][y]$ va fi egal cu o suma din $T[x][i-1][a] * T[b][i-1][y]$, unde $a$ si $b$ sunt doua valori ({$0$}, $1$ sau {$2$}) care pot fi plasate una dupa alta.
Vom calcula o matrice $T[x][i][y]$ = numarul de siruri de tritzi (mod P), de lungime $2^i^$ si pentru care primul trit are valoarea $x$, iar ultimul trit are valoarea $y$. $T[x][ 0 ][y]$ se determina direct, iar pentru $i > 0$, $T[x][i][y]$ va fi egal cu o suma din $T[x][i-1][a] * T[b][i-1][y]$, unde $a$ si $b$ sunt doua valori ({$0$}, $1$ sau {$2$}) care pot fi plasate una dupa alta.
Apoi vom scrie numarul $N$ ca o suma de puteri ale lui $2$: $N = 2^p1^ + 2^p2^ + ..  2^pK^$. Vom calcula o matrice $U[x][i][y]$ = numarul de siruri de tritzi (mod P) de lungime $2^p1^ + 2^p2^ + .. + 2^pi^$, pentru care primul trit are valoarea $x$ si ultimul trit are valoarea $y$. Avem $U[x][0][y] = T[x][p0][y]$. Pentru $i > 0$, $U[x][i][y]$ este egal cu o suma din $U[x][i-1][a] * T[b][pi][y]$, unde $a$ si $b$ sunt doua valori de tritzi care pot fi plasate una dupa alta. Rezultatul final il vom obtine adunand toate valorile $U[x][K][y]$, unde $K$ este numarul de biti de $1$ din reprezentarea binara a lui $N$.
Apoi vom scrie numarul $N$ ca o suma de puteri ale lui $2$: $N = 2^p1^ + 2^p2^ + ..  2^pK^$. Vom calcula o matrice $U[x][i][y]$ = numarul de siruri de tritzi (mod P) de lungime $2^p1^ + 2^p2^ + .. + 2^pi^$, pentru care primul trit are valoarea $x$ si ultimul trit are valoarea $y$. Avem $U[x][ 0 ][y] = T[x][p0][y]$. Pentru $i > 0$, $U[x][i][y]$ este egal cu o suma din $U[x][i-1][a] * T[b][pi][y]$, unde $a$ si $b$ sunt doua valori de tritzi care pot fi plasate una dupa alta. Rezultatul final il vom obtine adunand toate valorile $U[x][K][y]$, unde $K$ este numarul de biti de $1$ din reprezentarea binara a lui $N$.
h3.Probleme asemanatoare
h3. Solutia 1
Vom avea $pmin[0] = 0$ si $pmin[i] = 1 + min { pmin[j] | subsirul j+1,..,i este un palindrom }$, cu $0 ≤ j ≤ i-1$. Pentru a determina rapid daca subsirul dintre $2$ pozitii $k$ si $l$ este un palindrom, vom calcula o matrice $Pali[k][l]$, avand valorile $1$ si $0$, daca subsirul dintre pozitiile $k$ si $l$ este palindrom sau nu. Vom avea $Pali[k][l] = 1$, daca $sir[k] = sir[l]$ si $Pali[k+1][l-1]=1$ (pentru cazul in care {$l-k ≥ 2$}). Pentru ca aceasta solutie sa se incadreze in timp, va trebui ca matricea sa o calculam coloana cu coloana, pe masura ce avem nevoie de valorile din ea.
Vom avea $pmin[ 0 ] = 0$ si $pmin[i] = 1 + min { pmin[j] | subsirul j+1,..,i este un palindrom }$, cu $0 ≤ j ≤ i-1$. Pentru a determina rapid daca subsirul dintre $2$ pozitii $k$ si $l$ este un palindrom, vom calcula o matrice $Pali[k][l]$, avand valorile $1$ si $0$, daca subsirul dintre pozitiile $k$ si $l$ este palindrom sau nu. Vom avea $Pali[k][l] = 1$, daca $sir[k] = sir[l]$ si $Pali[k+1][l-1]=1$ (pentru cazul in care {$l-k ≥ 2$}). Pentru ca aceasta solutie sa se incadreze in timp, va trebui ca matricea sa o calculam coloana cu coloana, pe masura ce avem nevoie de valorile din ea.
h3. Solutia 2
Complexitatea ambelor solutii este $O(N^2^)$, insa a doua solutie merge mai repede, in practica, deoarece ia in considerare numai palindroamele valide (care pot fi cel mult {$O(N^2^)$}).
h2. 'Furnica':problema/furnica
h2. Furnica
* daca pozitia de start este $'C'$, atunci raspunsul este $(t+1)^2^$
* daca pozitia de start este $'S'$, atunci:
** daca $t$ este par, atunci raspunsul este $((t/2)+1)^2^$
** daca $t$ este impar, atunci raspunsul este $((t+1)*(t+2)/2)-((t+1)/2)^2^$
h2. Flori2
Aceste formule (sau altele echivalente) pot fi obtinute folosind urmatorul rationament: furnica se poate afla in orice pozitie aflata la o distanta care are aceeasi paritate ca si $t$, fata de pozitia initiala. Pentru pozitia de start $'C'$, aceste pozitii formeaza niste "romburi", iar pentru pozitia de start $'S'$, aceste pozitii formeaza niste diagonale "secundare".
h2. Bitmap
h2. 'Flori2':problema.flori2
h2. Cascaval
Pentru fiecare punct $i$, se sorteaza toate celelalte $N-1$ puncte in jurul punctului $i$ (in functie de unghi). Parcurgand apoi punctele in ordinea sortata, vom determina numarul maxim de puncte avand acelasi unghi fata de $i$ (folosind o precizie corespunzatoare, de $10^-8^$, de exemplu). Fie acest numar $MAX{~i~}$. Raspunsul cautat este $maxim{MAX{~i~} + 1}$ si se obtine in complexitate $O(N^2^*logN)$.
h2. Cercuri3
Solutia de complexitate $O(N^3^)$, in care se fixeaza $2$ puncte si se determina in $O(N)$ numarul de puncte ce se afla pe dreapta determinata de cele $2$ puncte, nu se incadreaza in timp.
h2. Antitero
h3. Probleme asemanatoare
 
* 'Rabbit Hunt / TIMUS':http://acm.timus.ru/problem.aspx?space=1&num=1052
* 'Maximum Number of Colinear Points / KATTIS':https://kattis.csc.kth.se/problem?id=maxcolinear
 
h2. 'Bitmap':problema/bitmap
 
O prima solutie ar consta in a incerca toate cele $4$ posibilitati de a codifica un bitmap care nu are toate celulele de aceeasi culoare. Aceasta abordare de tip backtracking nu s-ar incadra in timp. Optimizarea necesara consta in 'memoizarea':http://en.wikipedia.org/wiki/Memoization starilor prin care trecem in cadrul backtracking-ului (algoritmul nu se mai numeste backtracking acum, ci devine un fel de programare dinamica). O stare este data de $2$ numere pe cel mult $11$ biti, $S{~1~}$ si $S{~2~}$. Bitii de $1$ din $S{~1~}$ definesc liniile selectate din cadrul bitmap-ului initial, iar bitii de $1$ din $S{~2~}$ definesc coloanele selectate din cadrul bitmap-ului initial. Bitmap-ul definit de starea $(S{~1~},S{~2~})$ este reprezentat de celulele aflate la intersectia dintre liniile selectate de $S{~1~}$ si coloanele selectate de $S{~2~}$. Prin urmare, vom calcula $lmin[S{~1~},S{~2~}]$ = lungimea minima a bitmap-ului ce corespunde starilor $S{~1~}$ si $S{~2~}$. $lmin[2^M^ 1,2^N^-1]$ va contine rezultatul cautat. Pentru ca solutia sa se incadreze in timp, matricea cu valorile asociate fiecarei stari nu trebuie reinitializata la fiecare test. Se va folosi o matrice suplimentara $last_test$, in care vom memora numarul ultimului test in care am ajuns sa calculam valoarea pentru starea $(S{~1~},S{~2~})$. Daca ajungem la starea $(S{~1~},S{~2~})$ in testul curent, vom verifica valoarea lui $last_test[S{~1~},S{~2~}]$. Daca aceasta este egala cu numarul testului curent, inseamna ca am calculat deja valoarea respectiva; in caz contrar, o vom calcula acum si vom seta $last_test[S{~1~},S{~2~}]$ la numarul testului curent.
 
h2. 'Cascaval':problema/cascaval
 
 
h2. 'Cercuri3':problema/cercuri3
 
O metoda simpla este sa translatam primul cerc in originea sistemului de axe de coordonate si sa il rotim pe cel de-al doilea pana cand centrul acestuia se afla pe axa $OX$ (la coordonata $X$ egala cu distanta dintre cele $2$ centre). Trebuie analizate cateva cazuri, pe baza valorilor razelor celor $2$ cercuri si a distantei dintre centrele lor (cazurile simple sunt cand unul din cercuri se afla complet in interiorul, respectiv complet in exteriorul celuilalt cerc). In cazul in care se decide ca cele $2$ cercuri se intersecteaza in $2$ puncte, vom observa ca, in urma translatiei si rotatiei efectuate, cele $2$ puncte de intersectie se vor afla la aceeasi coordonata $x$, dar la coordonate $y$ opuse (egale in modul, dar opuse ca semn). Vom determina cele $2$ coordonate folosind 'Teorema lui Pitagora generalizata':http://en.wikipedia.org/wiki/Pythagorean_theorem in triunghiul format din centrele celor $2$ cercuri si fiecare din cele $2$ puncte de intersectie (deoarece cunoastem lungimile tuturor laturilor). Aria comuna a celor 2 cercuri este acum formata din 2 bucati de cerc, de o parte si de alta a segmentului ce uneste cele 2 puncte de intersectie. Aria fiecareia din cele 2 bucati de cerc se poate scrie ca diferenta dintre aria unui sector de cerc (corespunzator segmentului ce uneste punctele de intersectie) si aria unui triunghi (format din centrul unui cerc si cele 2 puncte de intersectie). O formulare suficient de generala a expresiilor ce calculeaza aria comuna permite tratarea unitara a cazurilor in care cel de-al doilea cerc are centrul in exteriorul, respectiv in interiorul primului cerc.
 
h3. Link-uri utile:
* 'Circle-Cirlce Intersection / Mathworld':http://mathworld.wolfram.com/Circle-CircleIntersection.html
h2. Sistem2
h3. Probleme asemanatoare:
* 'Cercuri / Happy Coding 2005 [2]':problema/cercuri
* 'Cerc2 / Happy Coding 2007':problema/cerc2
h2. Optic
h2. 'Antitero':problema/antitero
 
$cat timp (exista un soldat care se poate deplasa in siguranta intr-o pozitie de unde poate omori un terorist)$
	$deplaseaza soldatul in pozitia respectiva si elimina teroristul$
$daca toti soldatii pot ajunge in siguranta la destinatie, atunci deplaseaza-i acolo si incheie misiunea cu succes$
$altfel: "Mission aborted!"$
 
Aceasta este schita unui algoritm usor de implementat care rezolva problema. Practic, se incearca eliminarea repetata a cat mai multor teroristi, dupa care se incearca deplasarea la destinatie. Rezolvarea problemei implica, asadar, doar parcurgeri repetate ale grafului (de exemplu, 'DF':http://en.wikipedia.org/wiki/Depth-first_search sau 'BF':http://en.wikipedia.org/wiki/Breadth-first_search), in care unele noduri sunt "blocate" (cele in care se afla teroristi in viata si cele amenintate de teroristi in viata).
 
h2. 'Sistem2':problema/sistem2
 
Problema se rezolva generand permutari ale celor $N$ variabile si verificand daca ele verifica constrangerile. Ideea importanta este ca verificarea satisfacerii constrangerilor sa nu se realizeze abia dupa ce s-a generat cate o permutarea intreaga, deoarece o astfel de abordare nu s-ar incadra in limita de timp. Pe masura ce selectam o valoare pentru un element $i$ al permutarii, vom verifica toate constrangerile care contin acel element si elemente dinaintea lui $i$ (ale caror valori au fost, de asemenea, deja selectate). Daca cel putin o constrangere nu este satisfacuta, nu vom mai continua generarea permutarii in continuare, ci vom trece la valoarea urmatoare a elementului $i$ (scapand, astfel, de un numar posibil foarte mare de permutari pe care le-am fi generat degeaba). Aceasta optimizarea nu ne-ar fi prea folositoare daca, de exemplu, toate constrangerile contin ultimul element (si verificarea lor se poate face abia la sfarsit), insa, putem schimba ordinea in care selectam valorile elementelor. De exemplu, daca luam elementele in ordinea in care apar acestea in constrangeri (intai cele din prima constrangere, apoi cele din a doua care nu apar si in prima, apoi cele din a treia care nu apar in primele doua s.a.m.d.), putem garanta ca dupa selectarea valorilor a cel mult $4$ elemente vom putea verifica prima constrangere si ca dupa cel mult $8$ elemente putem verifica a doua constrangere. Daca schimbam si ordinea constrangerilor, in asa fel incat constrangerile cu numar mai mic de variabile sa fie primele, obtinem niste optimizari si mai bune. Alta optimizare utila ar fi aceea ca, daca o constrangere contine $P$ variabile, dupa setarea valorilor a $P-1$ dintre ele se poate calcula valoarea celeialalte variabile. De asemenea, pentru fiecare element a carui valoare nu a fost setata inca s-ar putea memora multimea valorilor posibile pe care le mai poate lua in continuare (pe baza variabilelor avand valori setate si a multimilor de valori posibile ale variabilelor cu valori nesetate inca, dar impreuna cu care se afla in cel putin o constrangere),
 
In concluzie, problema nu se rezolva in timp polinomial (lucru care se putea ghici dupa numarul mic de variabile), fiind necesare unele optimizari. Ea poate fi privita ca un caz particular al 'problemei satisfacerii constrangerilor':http://en.wikipedia.org/wiki/Constraint_satisfaction, care este o problema generala, pentru care au fost studiati multi algoritmi si au fost gasite multe optimizari.
 
h2. 'Optic':problema/optic
h2. 'Zvon':problema/zvon
* 'Consilul tribului / BOI 2003':problema/trib
* 'Optic / Happy Coding 2007':problema/optic
h2. 'Cerc2':problema/cerc2
 
Observam ca distanta dintre oricare $2$ puncte in care fotonul atinge cercul este aceeasi ca cea dintre punctul initial si punctul $(R*cos(alfa), R*sin(alfa))$. Fie aceasta distanta $D$. Dupa $S$ secunde, fotonul se afla la o distanta $S mod D$ de ultimul punct in care a atins cercul. Operatia $modulo$ se poate defini si pentru numere reale, scriind $S$ ca fiind $k*D + r$, unde k este un numar intreg (si $r$ este restul impartirii). Putem folosi acum Teorema lui Pitagora generalizata, pentru a determina distanta de la foton la centrul cercului, in triunghiul format din punctul curent, ultimul punct de atingere a cercului si centrul cercului. O metoda mai simpla de a calcula aceasta distanta este de a calcula distanta de la centrul cercului la segmentul dintre $2$ puncte consecutive in care fotonul atinge cercul (aceasta distanta este {$R*sin(beta)$}). Cum perpendiculara din centrul cercului pe acest segment il intersecteaza exact in mijloc, putem folosi distanta fotonului fata de mijlocul segmentului si apoi Teorema lui Pitagora intr-un triunghi dreptunghic, pentru a calcula distanta de la foton la centrul cercului (in triunghiul format de centrul cercului, mijlocul segmentului si pozitia fotonului, distanta respectiva este lungimea ipotenuzei).
 
h3. Probleme asemanatoare:
h2. Cerc2
* 'Cercuri / Happy Coding 2005 [2]':problema/cercuri
* 'Cercuri3 / Happy Coding 2007':problema/cercuri3
h2. Puteri2
h2. 'Puteri2':problema/puteri2
h2. Aimin

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.