![]() | |
Regulament | Probleme | Clasament | Login | Forum | Contact |
Problema 1. Labirint circular - Teste Un algoritm de rezolvare a acestei probleme nu este foarte dificil de gasit. Totusi, implementarea, prin numarul mare de calcule de geometrie analitica, poate da nastere usor erorilor. Ideea generala din spatele algoritmului este construirea unui graf cu nodurile puncte din plan, graf format din: centrul labirintului, capetele arcelor (iesirilor) si cercul exterior (asa cum a fost el definit in enunt). Pentru a stabili distanta dintre centru si exterior, vom aplica o metoda de determinare a drumului minim intre doua noduri (ex. algoritmul lui Dijkstra). Prin conventie D(x,y) va reprezenta distanta directa (in labirint) dintre varfurile x si y (fara a trece prin noduri intermediare). Prin noduri interne vom defini varfurile grafului care sunt capete ale iesirilor in labirint. Calculul distantei directe dintre doua noduri interne (x si y) presupune analizarea a doua cazuri: a. Segmentul [x,y] nu intersecteaza nici un perete: D(x,y) coincide cu distanta in plan dintre puncte. b. Segmentul [x,y] intersecteaza cel putin un perete: Fie Cx cercul pe care se afla varful x si Cy cercul pe care se afla varful y. Daca Cx=Cy atunci distanta dintre puncte va fi egala cu lungimea arcului de cerc determinat de x si y. Daca valorile Cx si Cy sunt distincte, putem presupune, fara a pierde din generalitate, ca raza(Cx)<raza(Cy). In acest caz, pentru a calcula D(x,y) vom determina tangentele din punctul y la cercul Cx. Daca nici una din aceste tangente nu intersecteaza un perete atunci D(x,y) va fi egal cu Lungime_Tangenta+Min(Lungime_Arc(Tan1,x), Lungime_Arc(Tan2,x)), unde Lungime_Tangenta este distanta dintre punctul y si punctele de tangenta la cercul Cx, distanta egala pentru ambele puncte, Lungime_Arc(a,b) este lungimea arcului determinat de punctele a si b pe cercul Cx iar Tan1 si Tan2 reprezinta punctele de tangenta ale punctului y la cercul Cx. Daca una dintre tangente intersecteaza cel putin un perete, distanta D(x,y) se va calcula in modul prezentat anterior fara a lua in calcul tangenta in cauza. In cazul in care ambele tangente intresecteaza pereti, drumul direct dintre cele doua puncte nu face parte din solutia optima. Pentru determinarea distantei de la centrul labirintului la varfurile interne vom lua in considerare doar segmentele care nu intersecteaza nici un perete. Distanta directa la cercul exterior o vom calcula doar in cazul in care exista un segment care uneste centrul labirintului cu unul din punctele arcelor de pe cercul de raza maxima, segment care, ca si in celelalte situatii, nu trebuie sa intersecteze nici un perete. Pentru stabilirea distantelor de la varfurile interne la cercul exterior se va proceda analog modului de determinare a distantei directe de la centru la exterior. Orice alt caz nu afecteaza traseul optim. Pentru toate perechile de varfuri interne avem de determinat intersectia cu cei N peretii. Prin urmare, complexitatea algoritmului este O(N*K2).
Problema 2. Echipa fantastica - Teste Problema se rezolva prin metoda programarii dinamice. In Sol[J,F,M,A] vom avea valoarea maxima a unei echipe formate din F fundasi, M mijlocasi si A atacanti, folosind numai primii J jucatori. Pentru stabilirea valorilor Sol[J] avem nevoie de valorile Sol[J-1]. Astfel: pentru m=0,4 executa {Pana la acest punct, in Sol[j,f,m,a] avem valoarea maxima a unei echipe formata din f fundasi, m mijlocasi si a atacanti, folosind primii j jucatori, iar in echipa se afla si jucatorul j. Pentru a obtine valorile Sol[j] asa cum au fost ele definite, mai avem nevoie de executarea urmatorului bloc de instructiuni.} pentru f=0,4 executa La sfarsitul executiei algoritmului, in Sol[N,4,4,2] vom avea solutia problemei. Pentru ca numarul de fundasi, mijlocasi si atacanti necesari este constant (4-4-2), complexitatea algoritmului va fi O(N). Observand ca pentru obtinerea solutiilor la nivelul J avem nevoie doar de solutiile de la nivelul J-1, putem transforma structura Sol[J,F,M,A] in Sol[F,M,A], cu pretul folosirii unei variabile auxiliare, fapt care reduce necesarul de memorie de N/2 ori, scazand usor si timpul de executie.
Problema 3. Romb - Teste Pentru rezolvarea acestei probleme propunem un algoritm intuitiv, a carui complexitate este O(N2). Vom descompune rombul in doua triunghiuri, cu baza comuna, unul orientat in sus si celalalt in jos. La randul lor, triunghiurile vor fi descompuse in segmente (blocuri compacte de valori 1, aflate pe aceeasi linie). Prin Segment[i,j] vom defini raza celui mai mare grup compact de valori 1 aflat pe linia i, cu centrul in pozitia [i,j]. Triunghi_sus[i,j] arata raza celui mai mare triunghi orientat in sus, pentru care mijlocul bazei se afla in pozitia [i,j]. Triunghi_jos[i,j] va reprezenta raza celui mai mare triunghi orientat in jos, pentru care mijlocul bazei se afla in pozitia [i,j]. Romb[i,j] indica raza celui mai mare romb cu centrul in pozitia [i,j]. {Determinarea segmentelor} pentru i=1,N executa {Determinarea triunghiurilor orientate in sus si a celor orientate in jos} pentru j=1,M executa pentru j=1,M executa {Determinarea romburilor} pentru i=1,N executa Solutia va fi reprezentata de valoarea maxima din matricea Romb.
Problema 4. Flori pentru aniversare - Teste Pentru rezolvarea acestei probleme vom avea nevoie de un algoritm de drum minim. Data fiind structura grafului in care se cere determinarea drumurilor minime, o metoda indicata este algoritmul lui Lee. Vom construi doua matrice: V si A. Matricea V va contine lungimea drumului minim de la punctul de plecare al lui Vasilica la orice alt punct de pe harta orasului, in timp ce matricea A va indica lungimea drumului minim de la destinatia lui Vasilica (aniversarea) la orice alt punct de pe harta. Nu vom insista asupra modului de obtinere a valorilor din matricele A si V, deoarece algoritmul necesar este usor de implementat in cazul de fata. Pentru constructia solutiei optime se va analiza fiecare punct de pe harta. Astfel: Cost_Minim=Suma_Initiala {Deoarece se garanteaza existenta unei solutii}pentru i=1,N executa pentru j=1,N executa Timp=A[i,j]+V[i,j]-1; daca Timp<=Timp_Disponibil executa Cost=Timp*10+Cost_Flori(i,j); {Cost_Flori(i,j) - costul minim al buchetului la florariile vecine)} daca Cost<Cost_Minim executa Cost_Minim=Cost; sfarsit daca sfarsit daca sfarsit pentru sfarsit pentru La sfarsitul algoritmului Cost_Minim va indica solutia optima a problemei. Complexitatea algoritmului este O(N2).
Problema 5. Subsir de numere prime - Teste Rezolvarea acestei probleme se realizeaza prin implementarea algoritmului clasic de determinare a subsirului crescator de lungime maxima, algoritm ce are complexitatea O(N2). Desi exista algoritmi ce se executa in O(N*log(N)), dimensiunea datelor permite implementarea metodei standard. Pentru a avea un timp de executie mai bun, este necesara filtrarea sirului initial astfel incat acesta sa contina doar numerele prime. Complexitatea algoritmului de filtrare este O(N*Val_Max1/2), Val_Max1/2 reprezentand estimarea numarului de operatii ale unui test de primalitate pentru valori din intervalul [2,Val_Max]. Elementele sirului sunt limitate superior (la valoarea 30000) si, prin urmare, Val_Max este o constanta. De aici rezulta ca algoritmul de filtrare are complexitatea O(N), neafectand complexitatea generala de O(N2). Algoritmul de rezolvare este urmatorul: {Filtrarea sirului} Eliminate=0; {Determinarea subsirului maximal} pentru i=1,N executa pentru j=1,i-1 executa daca (S[i]>S[j]) si (Subsir_Maxim[j]>Subsir_Maxim[i]) executa Subsir_Maxim[i]=Subsir_Maxim[j] sfarsit daca sfarsit pentru Subsir_Maxim[i]=Subsir_Maxim[i]+1 sfarsit pentru Pentru determinarea lungimii maxime a unui subsir cu specificatiile enuntate vom cauta valoarea maxima a elementelor din variabila Subsir_Maxim. Deoarece reconstituirea solutiei este facila, nu vom insista asupra acestui aspect. |
Algoritmus este sponsorizat de Emuadmin. Copyright © 2004 Emuadmin SRL. Toate drepturile rezervate. Termeni de Utilizare. |
Ultima actualizare: 17/Oct/2004 |