Din GInfo 8/99 SOLUȚIILE problemelor propuseVă prezentăm în continuare soluțiile problemelor de la Olimpiada Balcanică de Informatică 1999. Rezolvările aparțin lui Tudor Ioan Leu din Focșani, medaliat cu argint la BOI '99
P089901: Drumuri pavateCele două condiții impuse mulțimii de drumuri pavate descriu un arbore parțial. Așadar, se cere numărul total de arbori parțiali ai grafului dat la intrare. Pentru generarea arborilor am folosit metoda backtracking. Principala dificultate constă în evitarea obținerii aceluiași arbore de mai multe ori. Pentru a elimina această posibilitate, sunt suficiente condițiile: 1) Rădăcina oricărui arbore este vârful numerotat cu 1. 2) Fiii unui nod deja existent în arbore sunt adăugați respectând o relație de ordine. În implementarea prezentată mai jos s-a folosit ordinea în care sunt dați la intrare vecinii nodului respectiv. Cu alte cuvinte, dacă nodul k face parte din arborele curent și în arbore am adăugat ca fii ai lui k vârfuri care se află în primele vk poziții în lista lui de vecini, nu-i vom putea adăuga fii decât dintre vecinii aflați pe o poziție mai mare decât vk.
P089902: Jocul flipAlgoritmul de rezolvare se bazează pe faptul că numărul de coloane al tablei este mic și, în consecință, se pot genera toate variantele de întoarcere a coloanelor. Variantele de întoarcere a coloanelor sunt reprezentate pe ultimii 9 biți ai variabilei contor k. Pentru fiecare dintre aceste variante, se parcurge toată tabla de joc și se calculează pentru fiecare linie numărul de piese care au la vedere fața neagră, apoi se decide dacă linia este întoarsă sau nu, în funcție de acest număr: mai mare decât 4 sau, respectiv, mai mic sau egal cu 4. Pentru o tablă cu m linii și n coloane, complexitatea algoritmului este O(2-m-n-min{m,n}).
P089903: De pază în galeria de artePentru fiecare perete al galeriei se poate determina regiunea din care acesta este vizibil. Intersecția acestor regiuni va fi formată din toate punctele în care paznicul ar putea fi așezat pentru a supraveghea toată galeria. Fie Pi(xi,yi) și Pi+1(xi+1,yi+1) capetele unui segment din conturul galeriei. 1) Dacă xi=xi+1 și yi<yi+1, atunci segmentul este vizibil din semiplanul închis constituit din dreapta suport a segmentului și din punctele din dreapta acesteia. 2) Dacă xi=xi+1 și yi>yi+1, atunci segmentul este vizibil din semiplanul închis constituit din dreapta suport a segmentului și din punctele din stânga acesteia. 3) Dacă yi=yi+1 și xi<xi+1, atunci segmentul este vizibil din semiplanul închis constituit din dreapta suport a segmentului și din punctele de sub aceasta. 4) Dacă yi=yi+1 si xi>xi+1, atunci segmentul este vizibil din semiplanul închis constituit din dreapta suport a segmentului și din punctele de deasupra acesteia. Aceste observații sunt valabile doar în cazul în care colțurile galeriei sunt date în sensul acelor de ceasornic. Dacă intersecția semiplanelor determinate este vidă, nu există soluție. Altfel, intersecția poate fi un punct, un segment sau un interior de dreptunghi.
P089904: Statistici la polițieIdeea de rezolvare este următoarea: se alege un punct O în interiorul poligonului; se observă că semidreptele determinate de punctul O și vârfurile poligonului împart planul în n regiuni disjuncte. Problema revine deci la: a) determinarea regiunii căreia îi aparține punctul de test A și b) verificarea faptului dacă A se află sau nu de aceeași parte a laturii corespunzătoare regiunii cu punctul O. Dacă punctul A se află de aceeași parte a laturii cu O, sau dacă este chiar pe latură, el corespunde cerinței inițiale. Altfel, el se află în afara poligonului. Mai ramâne de rezolvat cazul a). Se observă că măsurile unghiurilor pe care le formează semidreptele (OPi cu axa absciselor formează un șir de valori crescătoare. Punctul a) al rezolvării este echivalent cu găsirea intervalului căruia îi aparține măsura unghiului format de semidreapta (OA cu abscisa. Folosind căutarea binară, acest interval poate fi găsit într-un timp O(log N). Așadar, complexitatea algoritmului este O(M log N).
P089905: Râul HighwaterMetoda de rezolvare folosită este Divide et Impera. Se verifică dacă traseul direct între punctul de plecare și cel de sosire este împiedicat de vreun colț al unui mal. Dacă nu, atunci drumul este, evident, segmentul determinat de cele două puncte. Altfel, se selectează un colț O (despre care se știe cu siguranță că aparține traseului final) și se determină drumul în două etape: de la punctul de plecare la O și de la O la punctul de sosire. Tipurile de obstacole care pot apărea sunt: (a) colțuri ale malului vestic care se află în dreapta traseului direct; (b) colțuri ale malului estic care se află în stânga traseului direct. Selectăm "cel mai din dreapta" obstacol de tip (a) și "cel mai din stânga" obstacol de tip (b). (Atenție! Aceste exprimări nu se referă la abscisele punctelor de pe maluri, ci la unghiurile pe care le formează cu abscisa semidreptele determinate de punctul de plecare și aceste puncte). Obstacolul O căutat este cel cu ordonata mai mică dintre cele două selectate. Complexitatea algoritmului descris este O((M+N)2).
P089906: CunoștințeEste evident faptul că poate fi așezată prima în coadă orice persoană ai cărei cunoscuți se cunosc între ei. Ar putea să apară situația în care există mai multe persoane care respectă această condiție. În acest caz putem alege oricare dintre aceste persoane deoarece restul persoanelor pot fi așezate în imediata apropiere, deoarece persoanele rămase vor putea fi așezate în coadă ca și cum acea persoană ar fi prima (eliminând astfel persoana deja așezată anterior în coadă). De aceea după ce am așezat o persoană în coadă problema se reduce la cea inițială pentru restul persoanelor. Așadar, la fiecare pas, vom încerca să așezăm pe o poziție o persoană ai cărei cunoscuți care nu se află deja în coadă se cunosc între ei. Pentru simplificare, în momentul în care vom așeza o persoană în coadă, o vom șterge din lista cunoscuților tuturor celorlalte persoane. [cuprins] |