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
 Valoare=S[i]
 UltimulFactorGasit=0
 cat timp Valoare>1 executa
  daca PrimulFactor[Valoare]>UltimulFactorGasit atunci
   Frecventa[PrimulFactor[Valoare]]=Frecventa[PrimulFactor[Valoare]]+1
  sfarsit daca
  UltimulFactorGasit=PrimulFactor[Valoare]
  Valoare=Valoare/UltimulFactorGasit
 sfarsit cat timp
sfarsit pentru

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 demonstratie a acestei identitati poate fi facuta prin inductie. Daca graful initial e un arbore atunci identitatea este evidenta, deoarece din M=V-1 => F=1 (fata de suprafata infinita). Orice muchie nou introdusa in graf inchide un ciclu, impartind o fata in doua. Prin urmare, numarul de fete creste impreuna cu numarul de muchii.
In problema noastra nu trebuie sa numaram si fata exterioara, deci formula folosita va fi F=M-V+1. Aceasta formula este adevarata doar in cazul unei singure componente conexe. Pentru mai multe componente, formula devine F=M-V+C, unde C este numarul de componente conexe.

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.
Deasemenea, este necesara eliminarea cercurilor identice (cu acelasi centru si raze egale). Din orice multime cu astfel de cercuri este pastrat doar un singur element.

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.
Suportul minim are cel putin cardinalul unui cuplaj maxim deoarece fiecare muchie dintr-un cuplaj maxim trebuie sa aiba cel putin un capat in suport, iar muchiile cuplajului nu au capete comune.

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.
Tot ce ne mai ramane de facut este sa parcurgem nodurile in ordine lexicografica. Daca testul prezentat anterior da raspuns pozitiv vom introduce nodul curent in solutie si vom lucra cu graful nou obtinut. In caz contrar, reintroducem nodul curent in vechiul graf.
Complexitatea algoritmului de cuplaj este O(N3) iar in cel mai rau caz trebuie aplicat de N ori. Prin urmare complexitatea finala este O(N4).

 

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:
- pentru fiecare nod consideram o lista de culori L care reprezinta culorile inca nefolosite de muchiile incidente nodului;
- daca avem o muchie (x, y) iar listele Lx si Ly au o culoare comuna, atunci aceasta muchie va fi colorata prin acea culoare. In caz contrar, graful va fi recolorat astfel ca o asemenea culoare existe in listele Lx si Ly, dupa cum urmeaza:
Vor exista doua culori A si B, astfel incat Lx sa contina A si Ly sa contina B. Va exista o muchie E incidenta la varful y de culoare A. Subgraful grafului initial ce contine muchiile cu culorile A si B poate fi recolorat schimband intre ele culorile A si B, aceasta recolorare pastrand validitatea colorarii anterioare si va adauga la Ly pe A. Prin urmare, muchia (x, y) va putea fi colorata cu A.

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}
pentru i=1,M executa
 NE=NE+1
 Lista[NE]=Rest(Cifre[i],N) {operatia Rest(A,B) obtine restul impartirii lui A la B}
 Selectat[Lista[NE]]=1 {Selectat[i] va fi 1 daca in lista exista un numar care prin impartire la N obtine restul i}
 UltimaPozitie[NE]=-1
 UltimaCifra[NE]=Cifre[i]
sfarsit pentru

Pozitie=1
cat timp Pozitie<=NE executa
 pentru i=1,M executa
  Valoarea=Lista[Pozitie]
  Valoare=Rest((Valoare*10+Cifre[i]),N) {Se adauga o cifra la sfarsitul numarului}
  daca Selectat[Valoare]=0 atunci
   NE=NE+1
   Lista[NE]=Valoare
   Selectat[Valoare]=1
   UltimaCifra[NE]=Cifre[i]
   UltimaPozitie[NE]=Pozitie
  sfarsit daca
 sfarsit pentru
 Pozitie=Pozitie+1
sfasit cat timp

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