Regulament | Probleme | Clasament | Login | Forum | Contact

Problema 1. Volum

- Teste

Modul de rezolvare al acestei probleme reprezinta o generalizare a determinarii suprafetei ocupate de o multime de dreptunghiuri in plan.

Vom considera planele determinate de fetele de paralelipiped paralele cu planul XoY. Sortam aceste plane. Fie Z1 si Z2 doua plane consecutive din sirul sortat. Toate planele paralele cu XoY, aflate intre Z1 si Z2 vor determina in blocul de paralelipipede sectiuni identice. Astfel, va fi suficient sa determinam aria sectiunii si sa o inmultim cu distanta dintre planele Z1 si Z2. Suma valorilor obtinute pentru fiecare pereche de plane consective va fi exact volumul ocupat de cele N paralelipipede.

Problema determinarii suprafetei ocupate de o multime de dreptunghiuri in plan este una clasica si nu vom insista asupra modului de rezolvare a acesteia.

Complexitatea algoritmului este O(N3). Desi se poate obtine o complexitate de O(N2*log(N)) utilizand arbori de intervale, metoda prezentata, implementata "curat", este suficient de rapida pentru a obtine punctajul maxim.

 

Problema 2. Siruri omogene

- Teste

Datorita unei restrictii adaugate, am reusit sa transformam o problema simpla intr-una extrem de dificila, deocamdata nerezolvabila in conditiile impuse de enunt. Cea mai buna abordare a problemei, plecand de la premisele anterioare, a fost metoda backtracking, de altfel singurul punctaj maxim fiind obtinut astfel. Nu incurajam metode de rezolvare bazate pe declararea a mii de constante, la fiecare problema putandu-se obtine punctajul maxim fara a folosi astfel de tehnici. In acest sens, pentru evaluarea problemei am folosit date de test mult sub limitele specificate in enunt.

Lucram in continuare la gasirea unei solutii pentru aceasta problema si, in cazul in care vom reusi, va vom face cunoscut algoritmul de rezolvare.

 

Problema 3. Coliniaritate

- Teste

Algoritmul de rezolvare al acestei probleme nu este foarte dificil dar, datorita dimensiunii mari a datelor de intrare, sunt necesare unele optimizari pentru ca timpul de executie al programului sa se incadreze in secunda acordata.

Prezentam succint algoritmul standard de rezolvare a problemei:
- Vom lua fiecare punct in parte, considerandu-l centrul axelor de coordonate. Fie M acest punct si (Mx, My) coordonatele sale initale. Pentru fiecare punct P, coordonatele sale vor deveni (Px-Mx, Py-My);
- Consideram, pentru fiecare punct P, unghiul pe care segmentul MP il formeaza cu axa Ox;
- Sortam punctele dupa valoarea unghiului calculat la pasul precedent;
- In sirul astfel obtinut, cea mai mare secventa de puncte cu unghiul caracteristic identic, impreuna cu punctul M va reprezenta multimea maximala de puncte coliniare din care face parte M.

Complexitatea algoritmului este O(N2*log(N)), determinata de metoda de sortare.

Unele optimizari care se pot face pentru reducerea timpului de executie sunt prezentate mai jos:
- Sortam sirul initial de puncte dupa coordonata x si, in caz de egalitate, dupa y. In momentul alegerii ca pivot a punctului de pe pozitia i, vom lua in considerare doar punctele cu indicii i+1, i+2, ..., N. Algoritmul va fi de 2 ori mai rapid.
- Este bine stiut faptul ca operatiile cu numere reale incetinesc viteza de executie. Avand punctul M ca pivot, punctele A si B vor avea unghiurile caracteristice identice daca Ax*By=Bx*Ay. Fie U=CMMDC(Ax, Ay) si V=CMMDC(Bx, By). O noua conditie suficienta pentru stabilirea egalitatii unghiurilor este Ax/U=Bx/V si Ay/U=By/V. Singura dificultate consta in calcularea CMMDC(a, b). Deoarece valorile a si b sunt relativ mici, putem folosi, cu ajutorul unei preprocesari, un algoritm care, in cazul problemei de fata, se doveste a fi de aproximativ 2,2 ori mai rapid decat algoritmul lui Euclid. Prezentam, in pseudocod, algoritmul mentionat. UltimulFactor[i] reprezinta cea mai mare valoare din descompunerea in factori primi a numarului i. Sirul se va construi cu metoda "ciurului lui Eratostene". Inconvenientul principal este un necesar de memorie de ordinul O(Max), unde Max este valoarea maxima a parametrilor a si b in functia CMMDC(a,b). In cazul nostru, Max nu este mai mare decat 20000.

CMMDC=1
cat timp (a>1) si (b>1) executa
 daca UltimulFactor[a]=UltimulFactor[b] atunci
  CMMDC=CMMDC*UltimulFactor[a]
  a=a/UltimulFactor[a]
  b=b/UltimulFactor[b]
 altfel
  daca UltimulFactor[a]>UltimulFactor[b] atunci
   a=a/UltimulFactor[a]
  altfel
   b=b/UltimulFactor[b]
  sfarsit daca
 sfarsit daca
sfarsit cat timp

Optimizarile prezentate asigura incadrarea timpului de executie al programului in secunda acordata.

Problema 4. Agricultura

- Teste

Problema consta in determinarea submatricei cu numar maxim de elemente in care diferenta dintre valoarea maxima si valoarea minima este mai mica decat K.

Ideea generala din spatele celor mai multe din metodele de rezolvare consta in stabilirea a doua coloane (sau linii) intre care se va face cautarea. Avand fixate coloanele C1 si C2, se vor obtine toate solutiile valide pentru care prima coloana a submatricei este C1 iar ultima C2. Pentru fiecare linie avem nevoie de minimul si maximul de pe linia respectiva, luand in considerare doar elementele de pe pozitiile din intervalul [C1, C2]. Aceste valori se pot obtine rapid, la incrementarea valorii lui C2. Stabilim linia L1 si pentru aceasta linie vom determina linia L2 care determina marginea inferioara a submatricei. Pentru linia L1+1 marginea inferioara va fi cel putin egala cu L2, deci aceasta valoarea nu va scadea. Prin urmare, parcurgerea se face in O(N). Singura problema este determinarea, la cresterea lui L1, a minimului si maximului intre liniile L1 si L2. Folosind heap-uri, complexitatea determinarii submatricei maximale determinata de coloanele C1 si C2 este O(N*log(N)). Asadar, complexitatea generala va fi O(N3*log(N)). Cu mici optimizari la implementare, programul se va incadra fara probleme in secunda acordata.

Unii concurenti au obtinut algoritmi de complexitate O(N3), folosind in loc de heap-uri o structura de date numita "deque".

 

Problema 5. Orientarea muchiilor

- Teste

Rezolvarea consta in determinarea muchiilor "critice", singurele care nu pot fi orientate. O muchie este critica daca prin eliminarea sa graful isi pierde conexitatea. Eliminarea muchiei ar imparti varfurile grafului in doua multimi A si B. In graful initial, toate drumurile de la varfurile din multimea A la varfurile din multimea B (si reciproc) trec prin aceasta muchie. Orientarea acestei muchii ar limita existenta drumurilor numai spre una din aceste multimi.

Identificarea muchiilor critice se poate face printr-o parcurgere DF a grafului. Ideea ce sta la baza metodei este ca muchiile critice se afla in arborii caracteristici cautarilor DF si BF. Complexitatea cautarii in adancime, in cazul acestei probleme, este O(N2), deci fara probleme privind timpul de executie, putandu-se obtine punctaj maxim si cu algoritmi de clasa O(N3).

 


Algoritmus este sponsorizat de Emuadmin.
Copyright © 2004 Emuadmin SRL. Toate drepturile rezervate. Termeni de Utilizare.

Ultima actualizare: 27/Nov/2004