![]() | |
Regulament | Probleme | Clasament | Login | Forum | Contact |
Problema 1. Divizibilitate - Teste Primul pas pe care il vom face in rezolvarea problemei este construirea, cu ajutorul metodei ciurului lui Eratostene, a sirului PrimulFactor, unde PrimulFactor[i] va fi cea mai mica valoarea din descompunerea in factori primi a numarului i. Dupa determinarea acestui sir, se va proceda ca in secventa pseudocod prezentata mai jos. pentru i=1,N
executa La sfarsitul executiei algoritmului, solutia va fi reprezentata de catre valoarea maxima din sirul Frecventa. Executia ciurului lui Eratostene se face in O(Max*log(log(Max))), unde Max este valoarea maxima din sirul initial. La fiecare din pasii urmatori (N la numar) se va face cate o factorizare. Cel mai defavorabil caz apare atunci cand valoarea V ce trebuie factorizata este de forma 2P, caz in care complexitatea este O(log(V)). Complexitatea algoritmului de factorizare a tuturor elementelor din sir va fi O(N*log(Max)), iar complexitatea generala ((Max+N)*log(Max)).
Problema 2. Cercuri - Teste O rezolvare folosind geometria computationala pare foarte grea, lucrurile simplificandu-se mult daca abordam problema prin prisma unor notiuni de teoria grafurilor. Fiecare punct de intersectie va fi considerat un nod. Doua noduri vor fi legate prin o muchie daca exista un cerc pe care sa se afle amandoua iar intre ele sa nu existe nici un alt punct de intersectie. Acum vom folosi o teorema clasica de teoria grafurilor ce se refera la
grafuri planare, teorema cunoscuta sub numele de identitatea lui
Euler: intr-un graf planar, conex, se respecta egalitatea F= M-V+2,
unde M este numarul de muchii ale grafului, V e numarul de varfuri
(noduri) iar F este numarul de fete (zone, inclusiv zona exterioara
infinita). O atentie deosebita trebuie acordata punctelor de intersectie prin care
trec mai mult de doua cercuri, pentru a nu le numara de mai multe ori.
Putem rezolva aceasta problema prin sortarea punctelor de intersectie a
unui cerc cu toate celelalte cercuri. Deoarece pentru fiecare cerc este necesara o sortare a punctelor de intersectie, complexitatea generala a algoritmului va fi O(N2*log(N)).
Problema 3. Paznici - Teste Vom considera liniile si coloanele matricii ca fiind noduri iar
elementele cu valoarea 1 din matrice ca muchii intre linia si coloana pe
care se situeaza. Astfel, problema descrisa se transforma in problema
determinarii unui suport minim intr-un graf bipartit, adica a unei
multimi de noduri de cardinal minim astfel ca orice muchie a grafului sa
aiba cel putin un capat in aceasta multime. Problema aplicata pe un graf
general este NP-completa, dar intr-un graf bipartit e rezolvabila folosind
algoritmul ungar. Demonstratia faptului ca un cuplaj maxim are cel putin cardinalul unui suport minim este una mai laborioasa. Ea se gaseste la adresa http://www.csc.liv.ac.uk/~michele/TEACHING/COMP309/2003/Lec7.3.4.pdf Important pentru rezolvarea problemei de fata este ca, intr-un graf
bipartit, cardinalul cuplajului maxim este egal cu cardinalul suportului
minim. Pentru a verifica daca un nod al grafului poate fi introdus intr-un
suport minim, il vom scoate temporar din graf si vom testa daca diferenta
dintre cardinalul cuplajului maxim in vechiul graf si cardinalul
cuplajului maxim in graful nou este egala cu 1.
Problema 4. Colorare - Teste Intr-un graf bipartit, numarul minim de culori necesar pentru colorarea muchiilor astfel incat oricare doua muchii cu un capat comun sa aiba culori diferite este egal cu gradul maxim al unui varf din acest graf. Vom colora muchiile dupa urmatorul algoritm: Pe noi ne intereseaza, de fapt, numai subgraful conex cu muchii colorate cu A sau B, care il contine si pe nodul y. Deoarece graful initial e bipartit iar gradele nodurilor subgrafului nu depasesc valoarea 2, subgraful va fi un lant, recolorarea acestuia realizandu-se usor, printr-un algoritm recursiv. Complexitatea algoritmului este O((N+M)*K) unde N+M este numarul de noduri si K numarul de muchii ale grafului.
Problema 5. Multiplu - Teste Pentru rezolvarea problemei vom avea nevoie de o lista in care se vor pastra cele mai mici numere care, prin impartire la N, dau resturi distincte. Solutia va fi consituita de acel numar care prin impartire la N obtine restul 0. Lista se va obtine prin parcurgerea in latime a spatiului solutiilor, ca in cazul algoritmului lui Lee. Pentru a nu pastra numerele in lista (deoarece acestea pot avea mii de cifre) vom retine doar informatii suficiente pentru a le reconstitui. Este suficienta memorarea ultimei cifre adaugate si a pozitiei din lista a numarului la care s-a alipit aceasta cifra. Reconstituirea se va face printr-un algoritm recursiv. NE=0 {Numarul de elemente din
lista} Pozitie=1 Daca Selectat[0] va avea valoarea 1 inseamna ca putem construi un multiplu al numarului N folosind cele M cifre. Mai mult, numarul ce se poate reconstitui pe baza informatiilor dobandite este si cel mai mic cu aceasta proprietate. Complexitatea algoritmului este O(N*M). |
Algoritmus este sponsorizat de Emuadmin. Copyright © 2004 Emuadmin SRL. Toate drepturile rezervate. Termeni de Utilizare. |
Ultima actualizare: 1/Dec/2004 |