Sunteți pe pagina 1din 0

1.

Problemele Olimpiadelor de Informatic



1.1. Faza Local Cluj-Napoca, 2003

1.1.1. Numere
Se consider un numr natural N cuprins ntre 1 i 16. Va trebui s construii un ir
care conine toate numerele cuprinse ntre 1 i 2
N
astfel:
se pornete cu irul care conine numerele 1 i 2;
naintea acestui ir este inserat numrul 3, iar la sfritul irului este inserat num-
rul 4, obinndu-se irul 3, 1, 2, 4;
naintea acestui ir sunt inserate numerele 5 i 6, iar la sfritul irului sunt insera-
te numerele 7 i 8, obinndu-se irul 5, 6, 3, 1, 2, 4, 7, 8;
procedeul continu pn la inserarea tuturor celor 2
N
numere.

Aadar, la fiecare pas i irul va conine primele 2
i
numere i naintea sa vor fi inse-
rate urmtoarele 2
i-1
numere, iar la sfritul su vor fi inserate urmtoarele 2
i-1
numere.

Date de intrare
Fiierul de intrare NUMERE.IN va conine o singur linie pe care se va afla valoarea N.

Date de ieire
Fiierul de ieire NUMERE.OUT va conine o singur linie pe care se vor afla cele 2
N

elemente ale irului construit potrivit regulilor prezentate anterior. Elementele irului
vor fi separate prin cte un spaiu.

Exemplu
NUMERE.IN NUMERE.OUT
4 9 10 11 12 5 6 3 1 2 4 7 8 13 14 15 16

Timp de execuie: 1 secund/test

1.1.2. Triunghi
Se consider un triunghi (determinat de trei puncte necoliniare din plan) i alte N
puncte din plan.
12 Problemele Olimpiadelor de Informatic



S se determine cte dintre aceste N puncte se afl n interiorul triunghiului. Un
punct este considerat a fi n interiorul triunghiului i n cazurile n care se afl pe una
dintre cele trei laturi sau este unul dintre cele trei vrfuri ale triunghiului.

Date de intrare
Primele trei linii ale fiierului de intrare TRIUNGHI.IN conin cte dou numere n-
tregi reprezentnd coordonatele vrfurilor triunghiului. Urmtoarea linie conine nu-
mrul N al celorlalte puncte. Fiecare dintre urmtoarele N linii va conine cte dou
numere ntregi reprezentnd coordonatele unui punct.

Date de ieire
Fiierul de ieire TRIUNGHI.OUT trebuie s conin o singur linie pe care se va afla
numrul punctelor din interiorul triunghiului.

Restricii i precizri
1 N 100000;
coordonatele punctelor sunt numere naturale cuprinse ntre 0 i 255;
coordonatele tuturor punctelor sunt date n ordinea: coordonata pe axa Ox, coor-
donata pe axa Oy.

Exemple
TRIUNGHI.IN TRIUNGHI.OUT
0 0 2
10 0
0 10
3
1 1
5 5
10 1

TRIUNGHI.IN TRIUNGHI.OUT
0 0 0
1 0
0 1
3
1 1
2 2
3 3

Timp de execuie: 1 secund/test


OLI Cluj-Napoca 2003 13


1.1.3. Guri
Se consider o matrice ale crei elemente fac parte din mulimea {0, 1}. O regiune
este o parte a matricei care conine elemente cu aceeai valoare, astfel nct se poate
ajunge din orice element al regiunii n oricare altul prin deplasri pe orizontal sau
vertical, trecnd doar prin elemente ale regiunii. O gaur este o regiune de zerouri
care nu "atinge" marginile matricei. Va trebui s determinai numrul de elemente pe
care le conine cea mai mare gaur (cea care conine un numr maxim de elemente).

Date de intrare
Prima linie a fiierului de intrare GAURI.IN conine dou numere ntregi M i N care
reprezint numrul liniilor, respectiv numrul coloanelor matricei. Fiecare dintre ur-
mtoarele M linii conin cte N cifre din mulimea {0, 1}. Acestea reprezint valorile
elementelor matricei. Valorile de pe o linie nu vor fi separate prin spaii.

Date de ieire
Fiierul de ieire GAURI.OUT trebuie s conin o singur linie pe care se va afla nu-
mrul elementelor din cea mai mare gaur.

Restricii i precizri
1 M, N 100;
dac nu exist nici o gaur, se consider c cea mai mare gaur are 0 elemente;
pot exista mai multe guri care au acelai numr maxim de elemente.

Exemplu
GAURI.IN GAURI.OUT
8 8 4
00000000
00100111
01110101
01011011
01001010
01101001
00111111
00000000

Timp de execuie: 1 secund/test

1.1.4. Exponent
Se consider dou numere ntregi m i n. S se determine cea mai mare valoare k, ast-
fel nct numrul m! s fie multiplu al numrului n
k
.

14 Problemele Olimpiadelor de Informatic



Date de intrare
Fiierul de intrare EXPONENT.IN conine o singur linie pe care se afl dou numere
ntregi, separate printr-un spaiu, reprezentnd valorile m i n.

Date de ieire
Fiierul EXPONENT.OUT va conine o singur linie pe care se va afla valoarea k.

Restricie
2 m, n 2000000000 (dou miliarde).

Exemplu
EXPONENT.IN EXPONENT.OUT
20 24 6

Timp de execuie: 1 secund/test
1.1.5. Soldai
Se consider n soldai care fac parte dintr-un detaament i n valori care reprezint
numrul de pachete de hran pe care le poate duce fiecare dintre soldai (prima valoare
corespunde primului soldat, a doua valoare celui de-al doilea soldat etc.). Soldaii tre-
buie dispui ntr-un numr nenul b de bastioane, respectnd condiiile:
nu pot exista bastioane fr soldai;
bastioanele sunt identificate prin numere cuprinse ntre 1 i b i pot fi distruse, dar
numai unul dup altul, ncepnd cu primul (cu alte cuvinte, un bastion nu poate fi
distrus dac nu sunt distruse toate bastioanele din faa lui);
pentru orice numr d de bastioane (0 d b 1) care pot fi distruse, pachetele de
hran purtate de soldaii din bastionul d + 1 trebuie s poat fi mprite exact (fr
fraciuni de pachet) la toi soldaii rmai n bastioanele identificate prin numere
cuprinse ntre d + 1 i b (cele care nu au fost distruse).

Date de intrare
Prima linie a fiierului de intrare SOLDATI.IN va conine numrul n al soldailor. Cea
de-a doua linie va conine cele n valori care reprezint numrul de pachete de hran pe
care le poate duce fiecare soldat. Aceste valori vor fi separate prin cte un spaiu.

Date de ieire
Fiierul de ieire SOLDATI.OUT va conine un numr de linii egal cu numrul bastioa-
nelor. Fiecare linie va conine numrul pachetelor pe care le pot duce soldaii din bas-
tionul respectiv. Aceste numere vor fi separate prin cte un spaiu.

OLI Cluj-Napoca 2003 15


Restricii i precizri
2 n 1000;
un soldat va duce cel puin unul i cel mult 1000 de pachete;
dac exist mai multe soluii, trebuie generat doar una dintre ele;
pentru datele de test folosite va exista ntotdeauna cel puin o soluie.

Exemplu
SOLDATI.IN SOLDATI.OUT
6 2 4
4 10 3 9 2 3 3 9
10
3
Explicaie
Detaamentul este format din ase soldai. Soldaii de la primul bastion pot duce 6 pa-
chete care pot fi mprite la cei ase soldai (cazul n care nu cade nici un bastion).
Soldaii de la al doilea bastion pot duce 12 pachete care pot fi mprite la cei patru
soldai rmai (cazul n care nu cade primul bastion).
Soldatul de la al treilea bastion poate duce 10 pachete care pot fi mprite la cei
doi soldai rmai (cazul n care cad primele dou bastioane).
Soldatul de la ultimul bastion poate duce 3 pachete. Acestea nu mai trebuie mpri-
te deoarece a rmas un singur soldat. Dac la ultimul bastion rmas ar fi fost plasai
mai muli soldai, atunci numrul total de pachete pe care le duc soldaii de la acest
bastion trebuie s poat fi mprit la numrul soldailor de la acest bastion.
Dispunerea tuturor soldailor ntr-un singur bastion nu este posibil, deoarece nu-
mrul total al pachetelor de hran este 31, care nu este multiplu de 6.

Timp de execuie: 1 secund/test
1.1.6. Graf
Se consider un graf conex cu n vrfuri i m muchii. Nodurile sunt identificate prin
numere cuprinse ntre 1 i n. S se determine nodul aflat la cea mai mare distan fa
de nodul identificat prin numrul 1. Distana este dat de lungimea minim a unui
drum de la nodul respectiv la nodul identificat prin numrul 1.

Date de intrare
Prima linie a fiierului de intrare GRAF.IN va conine numrul n al nodurilor i num-
rul m al muchiilor, separate printr-un spaiu. Fiecare dintre urmtoarele m linii va de-
scrie o muchie a grafului; ea va conine dou numere x i y, separate printr-un spaiu,
cu semnificaia: exist o muchie ntre nodul identificat prin numrul x i nodul identi-
ficat prin numrul y.
16 Problemele Olimpiadelor de Informatic



Date de ieire
Fiierul de ieire GRAF.OUT va conine o singur linie pe care se va afla numrul prin
care este identificat nodul aflat la cea mai mare distan fa de nodul identificat prin
numrul 1.

Restricii i precizri
1 n 100;
n m 1000;
nu pot exista dou sau mai multe muchii ntre aceleai dou noduri ale grafului;
dac exist mai multe noduri aflate la distana maxim, poate fi ales oricare dintre
ele.

Exemple
GRAF.IN GRAF.OUT
4 4 2
1 2
1 3
1 4
2 4

GRAF.IN GRAF.OUT
7 8 4
1 2
1 3
2 3
2 4
3 4
1 5
1 6
1 7

Timp de execuie: 1 secund/test
1.2. Olimpiada Naional de Informatic, 2002

1.2.1. Reconstrucie
n urma unor atentate cu bombe, unul dintre pereii unei cldiri n form de pentagonu
a suferit daune majore. Imaginea codificat a peretelui avariat se reprezint sub forma
unei matrice cu m linii i n coloane ale crei elemente sunt numere ntregi din muli-
mea {0, 1}. Valoarea 1 are semnificaia "zid intact", n timp ce semnificaia valorii 0
este "zid avariat".
ONI, 2002 17


Sumele alocate de guvern pentru refacerea cldirii vor fi donate celor care i vor
ajuta pe constructori s refac aceast cldire prin plasarea, pe vertical, a unor blocuri
de diverse nlimi i lime 1, n zonele care au fost avariate.
Pentru o structur dat a unui perete din cldire, determinai numrul minim de
blocuri necesare pentru refacerea construciei.
Date de intrare
Fiierul de intrare RECONSTR.IN conine, pe prima linie, dimensiunile m i n ale pere-
telui cldirii, iar pe urmtoarele m linii, cte n valori din mulimea {0, 1}, neseparate
prin spaii.
Date de ieire
Fiierul de ieire RECONSTR.OUT va conine, pe cte o linie, secvene de forma k nr,
unde k indic nlimea unui bloc, iar nr este numrul de blocuri de nlime k. Cele
dou numere vor fi separate prin cte un spaiu, iar liniile vor fi ordonate cresctor, n
funcie de valoarea k.
Restricii i precizri
1 m, n 200;
n fiierul de ieire nu vor aprea linii de forma k 0.

Exemplu
RECONSTR.IN RECONSTR.OUT
5 10 1 7
1110000111 2 1
1100001111 3 2
1000000011 5 1
1111101111
1110000111
Timp de execuie: 1 secund/test

1.2.2. Pod
ntre dou maluri ale unei vi adnci s-a construit un pod suspendat format din N bu-
ci de scndur, legate cu liane. Vom considera c scndurile sunt numerotate de la 1
la N, ncepnd de pe malul pe care ne aflm. n timp, unele buci de scndur s-au
deteriorat, iar altele chiar au disprut. Pentru traversarea podului se tie c:
se pot face pai doar de lungime 1, 2 sau 3;
scndurile deteriorate sunt nesigure, deci pe ele i de pe ele se pot face doar pai
de lungime 1;
evident, nu se poate pi pe o scndur care lipsete.
18 Problemele Olimpiadelor de Informatic



Scriei un program care s determine numrul de modaliti de traversare a podului
(mai exact, de a ajunge pe cellalt mal), precum i o soluie de traversare, dac o astfel
de soluie exist.
Date de intrare
Prima linie a fiierului de intrare POD.IN conine numrul n al scndurilor. Primul
numr de pe a doua linie este k i indic numrul scndurilor care lipsesc. Aceast li-
nie mai conine numerele de ordine ale celor k scnduri. Primul numr de pe a treia
linie este h i indic numrul scndurilor deteriorate. Linia mai conine numerele de
ordine ale celor h scnduri. Numerele de pe o linie sunt separate prin spaii.
Date de ieire
Prima linie a fiierului de ieire POD.OUT va conine numrul de posibiliti de a tra-
versa podul. n cazul n care podul nu poate fi traversat, linia va conine valoarea -1.
Dac podul poate fi traversat, pe a doua linie va fi descris o modalitate de traversare.
Pe aceast linie se vor afla numerele de ordine ale scndurilor pe care se pete, n
ordinea n care acestea sunt parcurse.
Restricii i precizri
3 n 300;
0 k, h n;
prima scndur nu poate lipsi;
numerele de ordine ale scndurilor deteriorate i numerele de ordine ale scnduri-
lor care lipsesc formeaz dou mulimi disjuncte;
numrul posibilitilor de traversare conine cel mult 80 de cifre.

Exemple
POD.IN POD.OUT
5 24
0 3
0
POD.IN POD.OUT
10 48
2 2 7 3 6 8
1 5
POD.IN POD.OUT
6 -1
2 2 4
1 3
Timp de execuie: 1 secund/test
ONI, 2002 19


1.2.3. Suma
Considerm irul format din primele N numere naturale: a
i
= i pentru i = 1, ..., N. Fie-
crui element al acestui ir i se asociaz un semn (+ sau ).
Pentru o valoare S dat se cere s se determine cel mai mic numr N astfel nct,
dup asocierea semnelor, elementele obinute s aib suma S.

Date de intrare
Fiierul SUMA.IN va conine un singur numr ntreg care reprezint suma care trebuie
obinut dup asocierea semnelor.

Date de ieire
Fiierul de ieire SUMA.OUT va conine, pe prima linie, numrul N al elementelor iru-
lui. Pe urmtoarele linii se vor afla indicii elementelor care au semn negativ, cte unul
pe o linie.

Restricie
0 < S 100000.

Exemple
SUMA.IN SUMA.OUT
12 7
1
7

Timp de execuie: 1 secund/test

1.2.4. Becuri
Un panou publicitar, de form dreptunghiular conine becuri, unul lng altul, aliniate
pe linii i coloane. Fiecare linie i fiecare coloan are un comutator care schimb sta-
rea tuturor becurilor de pe acea linie sau coloan, din starea n care se afl n starea
opus. Iniial panoul are toate becurile stinse. S se realizeze un program care, acio-
nnd asupra unui numr minim de linii i coloane, aduce panoul din starea iniial, la o
configuraie dat, dac acest lucru este posibil.

Date de intrare
Pe prima linie a fiierului de intrare BECURI.IN se afl dou numere naturale, m i n,
separate printr-un spaiu, reprezentnd numrul de linii, respectiv coloane, ale panou-
lui. Pe urmtoarele m linii se afl cte n numere, separate prin cte un spaiu, reprezen-
tnd configuraia final a panoului. Un bec aprins este codificat prin 1, n timp ce un
bec stins este codificat prin 0.
20 Problemele Olimpiadelor de Informatic



Date de ieire
Pe prima linie a fiierului de ieire BECURI.OUT se vor afla indicii coloanelor asupra
crora s-a acionat. Cea de-a doua linie va conine indicii liniilor asupra crora s-a ac-
ionat. Numerele de pe o linie vor fi separate prin cte un spaiu. Dac nu se acionea-
z asupra nici unei linii sau asupra nici unei coloane, pe linia corespunztoare va fi
scris doar valoarea 0. Numerotarea liniilor i a coloanelor ncepe de la 1. n cazul n
care nu exist nici o soluie, fiierul de ieire va conine o singur linie pe care se va
afla valoarea -1.

Restricie
1 m, n 100.

Exemple
BECURI.IN BECURI.OUT
5 6 2 5
1 0 1 1 0 1 1 2 3
1 0 1 1 0 1
1 0 1 1 0 1
0 1 0 0 1 0
0 1 0 0 1 0

Timp de execuie: 1 secund/test
1.2.5. Discuri
Se dau N numere reale care reprezint razele a N discuri. Considerm c aezm un
disc n sistemul xOy dac l plasm la o coordonat x pozitiv suficient de mare, tan-
gent cu axa Ox i deasupra ei, apoi l mpingem spre Oy pn cnd devine tangent cu
Oy sau cu primul disc ntlnit, aezat anterior. n figura rezultat, dup aezarea tuturor
discurilor n ordinea dat, unele dintre ele pot fi considerate dispensabile deoarece,
prin eliminarea lor, nu se modific limea total a figurii rezultate, adic nici un disc
nu se mai poate deplasa spre stnga. Sarcina voastr este de a scrie un program care
identific toate discurile dispensabile dintr-o configuraie dat.

Date de intrare
Fiierul de intrare DISCURI.IN conine pe prima linie numrul N al discurilor, iar pe
urmtoarele N linii cte un numr real care indic raza unui disc. Razele apar n ordi-
nea amplasrii discurilor.

Date de ieire
Prima linie a fiierului DISCURI.OUT va conine numrul K al discurilor dispensabile.
Pe urmtoarele K linii se vor afla numerele de ordine ale discurilor dispensabile.
ONI, 2002 21


Restricie
1 N 1000.

Exemplu
DISCURI.IN DISCURI.OUT
7 3
4 2
0.1 3
0.5 5
3
0.5
4
1

cercurile haurate sunt dispensabile

Timp de execuie: 1 secund/test
1.2.6. Cod
Transmiterea i memorarea informaiilor necesit diverse sisteme de codificare n ve-
derea utilizrii optime a spaiilor disponibile. Un sistem foarte des ntlnit este acela
prin care unei secvene de caractere i se asociaz un numr.
Se consider cuvintele formate numai cu literele mici ale alfabetului englez. Dintre
toate aceste cuvinte le considerm doar pe cele ale cror caractere sunt n ordine strict
lexicografic (caracterul de pe orice poziie este strict mai mic dect un eventual suc-
cesor). Sistemul de codificare se obine astfel:
se ordoneaz cuvintele n ordinea cresctoare a lungimilor lor;
cuvintele de aceeai lungime se ordoneaz lexicografic;
cuvinte sunt codificate prin numerotarea lor (n irul obinut dup ordonare):
1. - a
2. - b
...
26. - z
27. - ab
...
51. - az
52. - bc
...
83681. - vwxyz
...

Dndu-se un cuvnt, s se precizeze dac poate fi codificat conform sistemului de-
scris. n caz afirmativ, s se precizeze codul su.

22 Problemele Olimpiadelor de Informatic



Date de intrare
Fiierul de intrare COD.IN conine o singur linie pe care se afl un cuvnt.

Date de ieire
n cazul n care cuvntul poate fi codificat, fiierul de ieire COD.OUT va conine o
singur linie pe care se va afla codul acestuia. n caz contrar, fiierul va conine doar
valoarea 0.

Restricie
un cuvnt conine cel mult zece litere.

Exemplu
COD.IN COD.OUT
bf 55
COD.IN COD.OUT
aab 0
COD.IN COD.OUT
vwxyz 83681

Timp de execuie: 1 secund/test
1.2.7. Hotel
Departamentul administrativ al unui hotel are n angajai. Patronul hotelului hotrte
s schimbe costumele personalului din acest departament, astfel nct angajaii care
lucreaz la etaje diferite s fie mbrcai n haine colorate diferit, iar cei care lucreaz
la acelai etaj s fie mbrcai n haine colorate la fel. Angajaii sunt identificai printr-
un cod unic, care const ntr-un numr natural format din cel mult patru cifre.
S se determine numrul modalitilor de alegere a costumelor, astfel nct s fie
respectate condiiile descrise anterior. De asemenea, trebuie determinat i una dintre
aceste modaliti.

Date de intrare
Prima linie a fiierului de intrare HOTEL.IN conine numrul n al angajailor i num-
rul k al culorilor disponibile. Cele dou numere sunt separate printr-un spaiu. Pe ur-
mtoarele n linii se afl cte dou numere naturale, separate printr-un spaiu, primul
reprezentnd codul, iar al doilea etajul asociat unui angajat.



ONI, 2002 23


Date de ieire
Prima linie a fiierului de ieire HOTEL.OUT va conine numrul modalitilor de ale-
gere a costumelor. tiind c fiecare culoare este codificat printr-un numr natural
nenul mai mic sau egal cu k i c numerele asociate culorilor sunt distincte, n fiier se
va scrie pe cte o linie (ncepnd cu a doua) codul unei persoane i culoarea costumu-
lui, valori separate prin cte un spaiu. Ordinea apariiei n fiierul de ieire va fi ace-
eai cu cea din fiierul de intrare. Dac nu exist nici o soluie, n fiier se va scrie o
singur linie care va conine valoarea 0.

Restricii i precizri
1 n 1000;
1 k 200;
hotelul are cel mult 200 de etaje.

Exemple
HOTEL.IN HOTEL.OUT
4 5 60
123 2 123 1
35 1 35 2
430 2 430 1
13 0 13 3
HOTEL.IN HOTEL.OUT
5 2 0
12 1
13 0
14 1
10 2
11 0

Timp de execuie: 1 secund/test
1.2.8. Lac
O zon mltinoas are forma dreptunghiular, avnd nl linii i nc coloane. Ea este
format din celule cu latura de o unitate. O parte din acestea reprezint uscat, iar altele
reprezint ap, uscatul fiind codificat cu 0, iar apa cu 1. Se dorete s se obin un
drum de pe malul de nord spre cel de sud, trecnd doar pe uscat. Celulele cu ap pot fi
transformate n uscat, parautnd ntr-un loc cu ap cte un ponton (o plut) de dimen-
siunea unei celule. Deoarece parautarea este periculoas, se dorete minimizarea nu-
mrului de parautri. Pentru deplasare, dintr-o celul se poate trece ntr-o celul veci-
n pe linie, coloan sau diagonal.
Determinai numrul minim de pontoane i coordonatele acestora.
24 Problemele Olimpiadelor de Informatic



Date de intrare
Fiierul de intrare LAC.IN conine, pe prima linie, numerele naturale nl i nc, separate
printr-un singur spaiu. Pe urmtoarele nl linii se afl cte nc valori binare, separate
prin cte un spaiu, reprezentnd configuraia zonei (0 pentru uscat i 1 pentru ap).

Date de ieire
Prima linie a fiierului de ieire LAC.OUT va conine numrul minim k al pontoanelor
necesare. Pe urmtoarele k linii se vor afla cte dou numere naturale, separate prin
cte un spaiu, reprezentnd linia, respectiv coloana, n care a fost amplasat unul dintre
pontoane.

Restricie
1 nl, nc 100.

Exemplu
LAC.IN LAC.OUT
8 9 2
0 1 1 1 1 1 1 1 1 4 5
0 1 1 1 1 1 1 1 1 7 8
1 0 1 1 1 0 1 1 1
1 1 0 0 1 1 0 1 1
1 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 0 1 1

Timp de execuie: 1 secund/test

1.2.9. Logic
ntr-o zi a venit la mine un coleg i mi-a
propus un joc de logic. Mi-a artat urm-
toarea figur:
Pe aceast figur au fost numerotate
segmentele, pentru a fi mai clar noiunea
de segment. Avnd la dispoziie un creion
care se afl pe hrtie n zona exterioar,
trebuie s se traseze curbe pe foaie, fr s
se ridice creionul, astfel nct linia s trea-
c prin toate segmentele (fr a atinge ex-
tremitile) exact o dat.

ONI, 2002 25


La sfrit trebuie s se ajung tot n exterior. Liniile (curbele) se pot intersecta. Am
nceput i am ncercat de mai multe ori, dar n-am reuit.
Acum, cnd am mai crescut, am reuit
s demonstrez c nu se poate, dar am ob-
servat c pentru alte figuri este posibil.
Un exemplu n care problema are soluie
este:

Eu mi-am dat seama de ce uneori se poate i alteori nu, dar vreau s vd dac reu-
ii i voi. De aceea v voi da cteva figuri i, pentru fiecare, trebuie s rspundei cu
DA sau NU la ntrebarea: se poate sau nu trasa o curb avnd tipul descris mai sus?

Date de intrare
Fiierul de intrare LOGIC.IN are urmtoarea structur:
pe prima linie se afl numrul T al figurilor;
pe urmtoarele T grupuri de linii se afl datele corespunztoare celor T figuri, du-
p cum urmeaz:
pe prima linie a grupului se afl valoarea N care reprezint numrul de linii i
de coloane ale matricei ptratice care descrie figura;
pe urmtoarele N linii se afl cte N numere, separate printr-un spaiu (numere
ntregi cuprinse ntre 0 i 255), care reprezint elementele matricei.
Aceast matrice codific figura astfel: definim o zon ca fiind o parte continu a
matricei care conine acelai numr i este aria maxim cu aceast proprietate; altfel
spus, dou csue alturate (care difer la o singur coordonat printr-o unitate) care
conin acelai numr, se lipesc. Cu alte cuvinte, n interiorul zonei nu vor exista seg-
mente. La aceste zone se mai adaug i exteriorul matricei ca fiind o nou zon. n
matrice pot fi zone crora le corespunde acelai numr, dar care "nu se ating" i se
consider a fi zone diferite. Segmentele sunt segmente de dreapt care separ dou
zone i au lungimea maxim.
De exemplu, figura definit prin:
3
1 1 2
1 2 2
1 1 2
este urmtoarea:

Se observ c ntre zonele 1 i 2 exist cinci segmente, ntre zona 1 i exterior exis-
t trei segmente, iar ntre zona 2 i exterior exist tot trei segmente. Trebuie remarcat
faptul c segmentul numerotat n figura anterioar cu 10 este compus din trei segmen-
te mici, dar este considerat a fi un singur segment, conform definiiei.
26 Problemele Olimpiadelor de Informatic



Date de ieire
n fiierul LOGIC.OUT se vor scrie T linii, corespunztoare celor T figuri. Pe fiecare
linie va fi scris unul dintre mesajele DA sau NU, n funcie de rspunsul la ntrebare.

Restricii
1 T 10;
1 N 100.

Exemplu
LOGIC.IN LOGIC.OUT
2 DA
2 NU
1 2
3 4
4
1 1 2 2
1 1 2 2
3 4 4 1
3 4 4 1
Timp de execuie: 1 secund/test
1.2.10. Foto
Gigel, specialist n editare grafic pe calculator, se confrunt cu o problem. El trebuie
s aranjeze patru fotografii, disponibile n format electronic, ntr-o pagin de prezenta-
re, astfel nct suprafaa paginii s fie complet "acoperit" de cele patru fotografii i
fr ca acestea s se suprapun n vreun fel. Gigel poate modifica dimensiunile iniiale
ale fotografiilor, ns fr a deforma imaginile. Pentru aceasta el trebuie s pstreze
neschimbat raportul dintre lungimea i nlimea fotografiilor. Nu conteaz ordinea
aezrii fotografiilor, ele putnd fi translatate oriunde n cadrul paginii, ns operaiile
de rotaie nu sunt permise.
Determinai pentru fiecare fotografie dimensiunile finale, cunoscndu-se dimensiu-
nile paginii, precum i dimensiunile iniiale ale fotografiilor.

Date de intrare
Prima linie a fiierului de intrare FOTO.IN conine dou numere naturale l i h, separa-
te printr-un spaiu, reprezentnd lungimea, respectiv nlimea paginii. Pe urmtoarele
patru linii se afl cte dou numere naturale, separate printr-un spaiu, reprezentnd
lungimea, respectiv nlimea, uneia dintre cele patru fotografii care trebuie aranjate.


ONI, 2002 27


Date de ieire
Fiierul de ieire FOTO.OUT va conine patru linii pe care se vor afla cte dou numere
naturale care reprezint dimensiunile (lime i nlime) finale ale celor patru fotogra-
fii. Prima linie va corespunde primei fotografii din fiierul de intrare, a doua linie celei
de-a doua fotografii etc.

Restricii i precizri
dimensiunile paginii i ale fotografiilor sunt numere naturale cuprinse ntre 1 i
2000;
dac exist mai multe soluii va fi determinat doar una dintre ele;
exist ntotdeauna cel puin o posibilitate de amplasare a fotografiilor.

Exemplu
FOTO.IN FOTO.OUT
140 140 20 10
24 12 40 130
4 13 100 140
10 14 20 10
4 2

Timp de execuie: 1 secund/test
1.2.11. Balan
Gigel are o "balan" mai ciudat pe care vrea s o echilibreze. De fapt, aparatul este
diferit de orice balan pe care ai vzut-o pn acum. Balana lui Gigel dispune de
dou brae de greutate neglijabil, fiecare avnd lungimea 15. Din loc n loc, pe aceste
brae se afl crlige, de care Gigel poate atrna greuti distincte din colecia sa de G
greuti (numere naturale cuprinse ntre 1 i 25). Gigel poate atrna oricte greuti de
orice crlig, dar trebuie s foloseasc toate greutile de care dispune.
Gigel a reuit s echilibreze balana relativ repede, dar acum dorete s tie n cte
moduri poate fi ea echilibrat.
Cunoscnd amplasamentul crligelor i greutile pe care Gigel le are la dispoziie,
scriei un program care calculeaz n cte moduri se poate echilibra balana.

Date de intrare
Fiierul de intrare BALANTA.IN are urmtoarea structur:
pe prima linie se afl numrul C al crligelor i numrul G al greutilor; cele dou
numere sunt separate printr-un spaiu;
pe a doua linie se afl C numere ntregi distincte, separate prin spaiu, cu valori
cuprinse ntre -15 i 15 inclusiv, reprezentnd amplasamentele crligelor fa de
28 Problemele Olimpiadelor de Informatic



centrul balanei; valoarea absolut a numerelor reprezint distana fa de centrul
balanei, iar semnul indic braul balanei pe care se afl crligul, '-' pentru braul
stng i '+' pentru braul drept;
pe a treia linie se afl G numere naturale distincte, cuprinse ntre 1 i 25, reprezen-
tnd valorile greutilor pe care Gigel le va folosi pentru a echilibra balana.
Date de ieire
Fiierul de ieire BALANTA.OUT conine o singur linie, pe care se afl un numr natu-
ral M, numrul de variante de plasare a greutilor care duc la echilibrarea balanei.
Restricii i precizri
2 C, G 20;
exist ntotdeauna cel puin o variant i cel mult 100.000.000;
balana se echilibreaz dac suma produselor dintre greuti i coordonatele unde
ele sunt plasate este 0 (suma momentelor greutilor fa de centrul balanei este 0).

Exemplu
BALANTA.IN BALANTA.OUT
2 4 2
-2 3
3 4 5 8

Timp de execuie: 1 secund/test
1.2.12. Aliniere
n armat, o companie este alctuit din n soldai. La inspecia de diminea soldaii
stau aliniai n linie dreapt n faa cpitanului. Acesta nu e mulumit de ceea ce vede;
e drept c soldaii sunt aezai n ordinea numerelor de cod din registru, dar nu n ordi-
nea nlimii. Cpitanul cere ctorva soldai s ias din rnd, astfel ca cei rmai, fr
a-i schimba locurile, doar apropiindu-se unul de altul (pentru a nu rmne spaii mari
ntre ei) s formeze un ir n care fiecare soldat vede privind de-a lungul irului, cel
puin una din extremiti (stnga sau dreapta). Un soldat vede o extremitate dac ntre
el i captul respectiv nu exist un alt soldat cu nlimea mai mare sau egal cu a lui.
Scriei un program care determin, cunoscnd nlimea fiecrui soldat, numrul
minim de soldai care trebuie s prseasc formaia, astfel ca irul rmas s respecte
condiia impus de cpitan.

Date de intrare
Pe prima linie a fiierului de intrare ALINIERE.IN se afl numrul n al soldailor din
ir, iar pe linia urmtoare se afl un ir de n numere reale, cu maximum cinci zecimale
ONI, 2002 29


fiecare, separate prin spaii. Al k-lea numr de pe aceast linie reprezint nlimea
soldatului avnd codul k.

Date de ieire
Fiierul ALINIERE.OUT va conine pe prima linie numrul soldailor care trebuie s
prseasc formaia, iar pe linia urmtoare, codurile acestora n ordine cresctoare,
separate dou cte dou printr-un spaiu.

Restricii i precizri
nlimile soldailor sunt numere reale cuprinse ntre 0,5 i 2,5;
2 n 1000;
dac exist mai multe soluii posibile, se va alege doar una dintre ele.

Exemplu
ALINIERE.IN ALINIERE.OUT
8 4
1.86 1.86 1.30621 2 1.4 1 1.97 2.2 1 3 7 8

Timp de execuie: 1 secund/test

1.2.13. Arbore
Se consider un arbore cu N vrfuri, numerotate de la 1 la N. Scriei un program care
adaug arborelui dat un numr minim de muchii, astfel nct fiecare vrf al grafului
obinut s aparin exact unui singur ciclu.

Date de intrare
Prima linie a fiierului de intrare ARBORE.IN conine numrul N al vrfurilor arbore-
lui. Pe urmtoarele N 1 linii se afl cte dou numere, separate printr-un spaiu, care
reprezint extremitile uneia dintre muchiile arborelui.

Date de ieire
Prima linie a fiierului de ieire ARBORE.OUT conine numrul Nr al muchiilor adu-
gate. Pe urmtoarele Nr 1 linii se afl cte dou numere, separate printr-un spaiu,
care reprezint extremitile uneia dintre muchiile adugate. n cazul n care problema
nu are soluie, fiierul de ieire va conine o singur linie pe care se va afla valoarea -1.

Restricie
3 N 1000.


30 Problemele Olimpiadelor de Informatic



Exemple
ARBORE.IN ARBORE.OUT
4 -1
1 2
2 3
2 4

ARBORE.IN ARBORE.OUT
7 2
1 2 6 7
1 3 2 4
3 5
3 4
5 6
5 7

Timp de execuie: 1 secund/test

1.2.14. Decodificare
Serviciul Romn de Informaii a dat de urma unei organizaii teroriste care i are sedi-
ul pe teritoriul rii noastre. Folosind cei mai pricepui i mai bine antrenai spioni i
ofieri, SRI a reuit s identifice computerul principal al organizaiei teroriste. Dac va
reui s acceseze informaiile din acest computer, SRI i va putea aresta pe toi mem-
brii organizaiei i va asigura meninerea pcii mondiale. Singura problem este spar-
gerea codului de acces. Tot ceea ce se tie despre acest cod este c el este reprezentat
de ctre o permutare de lungime N. Specialitii SRI au ncercat diverse metode de a
descoperi codul, ns tot ceea ce au reuit s obin este un program care, transmin-
du-i-se ca parametru o permutare de lungime N, specific n cte poziii codul de acces
coincide cu aceasta.
Scriei un program care, folosind programul-ajuttor (reprezentat sub forma unui
modul), determin codul de acces n computerul teroritilor.

Date de intrare
Programul nu va citi date din nici un fiier de intrare. El va apela nti funcia GetN a
modulului PROG, care va returna valoarea N numrul de elemente ale permutrii care
trebuie descoperit.
Apoi va apela numai funcia Check, creia i va fi transmis ca parametru, de fie-
care dat, o permutare de lungime N. Aceast funcie va returna numrul de poziii n
care permutarea coincide cu permutarea care trebuie descoperit. Programul dumnea-
voastr trebuie ca, dup un numr finit de apelri ale funciei Check, s descopere
permutarea cutat.

ONI, 2002 31


Date de ieire
Programul va trebui s tipreasc n fiierul DECOD.OUT o permutare de lungime N.
Toate cele N elemente vor fi tiprite pe prima linie a fiierului, fiind separate de cte
un spaiu.
Restricie
5 N 256.

Instruciuni pentru programatorii n C/C++
Programatorii n C/C++ au la dispoziie header-ul PROG.H. n acest fiier sunt decla-
rate urmtoarele funcii:
int GetN(void)
int Check(int p[256])
Funcia Check are ca parametru un vector cu elemente ntregi. Ea va returna una
dintre urmtoarele valori:
valoarea -1 dac primele N elemente (ncepnd cu poziia 0) ale vectorului trans-
mis ca parametru nu constituie o permutare de lungime N;
n cazul n care permutarea este corect, se returneaz un numr cuprins ntre 0 i
N care reprezint numrul de poziii n care permutarea de lungime N transmis ca
parametru coincide cu permutarea care trebuie descoperit.

Instruciuni pentru programatorii n Pascal
Modulul extern este implementat sub forma unit-ului PROG. n acest unit sunt declara-
te urmtoarele tipuri i funcii care vor fi folosite n program:
type perm = array[1..256] of Integer;
function GetN:Integer;
function Check(var permut:perm):Integer;
Funcia Check are ca parametru un vector de tipul perm. Ea va returna una dintre
urmtoarele valori:
valoarea -1 dac primele N elemente (ncepnd cu poziia 0) ale vectorului trans-
mis ca parametru nu constituie o permutare de lungime N;
n cazul n care permutarea este corect, se returneaz un numr cuprins ntre 0 i
N care reprezint numrul de poziii n care permutarea de lungime N transmis ca
parametru coincide cu permutarea care trebuie descoperit.

Exemplu
S presupunem c permutarea cutat este 2 1 3 4 5. La nceput va fi apelat funcia
GetN; aceasta va returna valoarea 5. Vor urma apeluri succesive ale funciei Check,
pn n momentul n care aceasta returneaz valoarea 5. O posibil succesiune este:
32 Problemele Olimpiadelor de Informatic



apel pentru permutarea 1 2 3 4 5 - se returneaz 3;
apel pentru permutarea 3 2 1 4 5 - se returneaz 2;
apel pentru permutarea 2 1 3 4 5 - se returneaz 5.
Permutarea corect este scris n fiierul DECOD.OUT.
Timp de execuie: 1 secund/test

1.2.15. Seti
Se pare c, n sfrit, cuttorii vieii extraterestre au descoperit ceva! n cursul proiec-
tului SETI@home a fost izolat o secven care ar putea reprezenta un semnal de la
alte forme de via inteligent. Ca urmare, proiectul SETI@ONI i propune s verifice
dac acel semnal provine ntr-adevr de la extrateretri sau doar de la nite puti care
beau Fanta.
Pentru comoditate, poriunea de semnal care trebuie analizat vi se pune la dispozi-
ie sub forma unei succesiuni de litere ale alfabetului latin. De asemenea, avei la dis-
poziie i un dicionar de cuvinte extraterestre, codificate n acelai mod. Trebuie s
numrai de cte ori apare fiecare dintre aceste cuvinte n posibilul mesaj extraterestru.
Pornind de la aceste date, lingvitii pot s nceap lucrul la traducerea mesajului.
Date de intrare
Pe prima linie a fiierului de intrare SETI.IN se afl numrul N al liniilor mesajului.
Urmeaz N linii, fiecare coninnd exact 64 de litere ale alfabetului latin, urmate de
marcajul de sfrit de linie. Prin alipirea acestor linii se obine mesajul de analizat,
format din 64 N litere.
Pe prima linie a celui de-al doilea fiier de intrare DIC.IN este scris numrul M al
cuvintelor din dicionar. Urmeaz M linii, fiecare coninnd un cuvnt din dicionar,
reprezentat ca o secven de cel puin una i cel mult 16 litere. Cuvintele nu sunt ne-
aprat distincte.

Date de ieire
Fiierul de ieire SETI.OUT va conine exact M linii. Pe linia cu numrul i va fi scris
numrul de apariii ale celui de-al i-lea cuvnt din dicionar. Orice apariie a unui cu-
vnt trebuie numrat, chiar dac se suprapune peste alte apariii. Se va face distincie
ntre literele mari i literele mici.
Restricii i precizri
0 N < 2048;
5 M 32000;
un cuvnt poate avea cel mult 65535 de apariii.
ONI, 2002 33


Exemplu
SETI.IN
2
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBaba
babaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBaB
DIC.IN
3
b
bab
b
SETI.OUT
3
2
3

Timp de execuie: 1 secund/test

1.2.16. Suma divizorilor
Se consider dou numere naturale A i B. Fie S suma tuturor divizorilor naturali ai lui
A
B
. S se determine restul mpririi lui S la 9901.

Date de intrare
Pe prima linie a fiierului de intrare SUMDIV.IN se afl numerele A i B, separate prin
cel puin un spaiu.

Date de ieire
Fiierul de ieire SUMDIV.OUT va conine o singur linie pe care se va afla restul m-
pririi numrului S la 9901.

Restricie
0 A, B 50000000.

Exemplu
SUMDIV.IN SUMDIV.OUT
2 3 15

Timp de execuie: 0,5 secunde/test


34 Problemele Olimpiadelor de Informatic



1.2.17. Sistem
ntr-un jude exist N orae, numerotate de la 1 la N. Fiecare dintre cele N orae ale
judeului este legat de exact alte dou orae, prin strzi bidirecionale. i mai ciudat
este faptul c, n cadrul acestui sistem stradal, nu este ntotdeauna posibil s ajungi din
orice ora n oricare alt ora mergnd pe strzi. Oricum, locuitorii judeului sunt
mndri de acest sistem al lor i sunt de prere c nu mai exist altul la fel. Trebuie s
le demonstrai contrariul i pentru aceasta trebuie s calculai cte sisteme stradale dis-
tincte cu proprietatea de mai sus exist. Dou sisteme sunt considerate distincte dac
exist cel puin o strad ntre o pereche de orae i i j n cadrul primului sistem, care
nu exist n cadrul celui de-al doilea.

Date de intrare
Din fiierul SISTEM.IN vei citi valoarea N, care reprezint numrul de orae ale ju-
deului.

Date de ieire
n fiierul SISTEM.OUT se va scrie numrul de sisteme stradale distincte, cu proprieta-
tea c orice ora este legat prin strzi directe de exact alte dou orae.

Restricie
3 N 100.

Exemple
SISTEM.IN SISTEM.OUT
4 3

SISTEM.IN SISTEM.OUT
6 70

Timp de execuie: 1 secund/test

1.2.18. Comitat
Toate seminiile convieuitoare pe Terra au hotrt ca hobbiii, pstrtorii Inelului Pu-
terii, s fie izolai ntr-o zon a pmntului numit Comitat. Hotarele Comitatului tre-
buie s fie reprezentate de un poligon convex cu cte un turn de paz n fiecare vrf.
Se cunosc poziiile tuturor turnurilor din regiune (dou numere naturale raportate la
un sistem de axe rectangulare). Un paznic pe cal alb vegheaz hotarele Comitatului
parcugnd, pe rnd, toate distanele dintre dou turnuri succesive, mergnd pe drum
minim, numai pe crri paralele cu axele.
Se cunoate lungimea maxim a drumului pe care-l poate parcurge paznicul la un
tur complet al hotarelor Comitatului i se cere s se determine un poligon cu un numr
ONI, 2002 35


maxim de turnuri pe contur, poligon care poate constitui hotarul comitatului. n plus,
hotarul trebuie s conin turnul din Mordor (de coordonate 0 i 0) ntr-un vrf, iar n
fiecare dintre celelalte vrfuri se afl, obligatoriu, unul dintre turnurile existente.
De exemplu, pentru amplasamentul turnurilor ilustrat mai jos i pentru limita de 25
km a unui tur efectuat de paznic, hotarul Comitatului poate fi format, n aceast ordi-
ne, din turnurile de coordonate (0, 0), (4, 1), (8, 3), (4, 4), (1, 4), (0, 0). Se observ c
poligonul determinat de aceste turnuri este un poligon convex cu cinci turnuri pe con-
tur.


Poligonul cu vrfurile (0, 0), (4, 1), (4, 12), (0, 7), (0, 0) are tot cinci turnuri pe
contur, dar un tur complet al acestui poligon depete 25 km.

Date de intrare
Pe prima linie a fiierului de intrare COMITAT.IN se afl numrul n al turnurilor din
inut (turnul din Mordor nu este numrat). Pe fiecare dintre urmtoarele n linii se afl
cte dou numere naturale, desprite printr-un spaiu, care reprezint coordonatele
unuia dintre turnuri. Ultima linie a fiierului conine lungimea maxim L a unui tur
complet al poligonului.

Date de ieire
Prima linie a fiierului de ieire COMITAT.OUT va conine numrul v al turnurilor de
pe conturul poligonului (incluznd turnul din Mordor). Pe a doua linie se vor afla v 1
numere ntregi, reprezentnd numerele de ordine ale turnurilor de pe contur, pornind
de la turnul din Mordor (care nu este afiat) i respectnd succesiunea n sens trigo-
nometric sau antitrigonometric a turnurilor de pe contur.


36 Problemele Olimpiadelor de Informatic



Restricii i precizri
0 < n 50;
0 < L < 1000;
coordonatele turnurilor sunt numere ntregi cuprinse ntre 0 i 200;
pot exista turnuri n interiorul poligonului, dar acestea nu sunt luate n considerare
pentru numrarea turnurilor corespunztoare unui poligon;
exist posibilitatea ca soluia s fie dat de un poligon degenerat format dintr-un
singur vrf (Mordor), din dou vrfuri (Mordor i un alt turn) sau din mai multe
vrfuri coliniare;
pe conturul poligonului determinat pot exista turnuri coliniare;
dac exist mai multe soluii care respect condiiile din enun, se va furniza doar
una dintre acestea;
n fiierul de intrare nu exist dou turnuri ale cror poziii s coincid i singurul
turn din poziia (0, 0) este cel din Mordor.

Exemplu
COMITAT.IN COMITAT.OUT
9 5
0 7 4 7 5 2
1 4
2 2
4 1
4 4
4 9
8 3
9 9
10 5
25

Timp de execuie: 1 secund/test
1.3. Soluiile problemelor propuse spre rezolvare la
olimpiada de informatic, faza local, Cluj, 2003
1.3.1. Numere
Definirea recursiv a problemei sugereaz foarte clar modul de rezolvare a acesteia.
Vom crea dou rutine recursive, una care genereaz numerele din prima jumtate a
irului i una care genereaz numerele din a doua jumtate a irului.

OLI Cluj-Napoca 2003 37


Pentru prima parte a irului, la fiecare pas i se vor genera numere cuprinse ntre 2
i

i 3 2
i-1
1. Pentru a doua parte a irului, la fiecare pas i se vor genera numere cu-
prinse ntre 3 2
i-1
i 2
i+1
1.
Diferena principal a celor dou rutine recursive este poziia apelului recursiv fa
de generarea elementelor. Pentru prima parte a irului, apelul va aprea dup generare,
iar pentru a doua parte a irului, apelul va aprea naintea generrii.

Analiza complexitii
Datele de intrare constau ntr-un singur numr, deci ordinul de complexitate al opera-
iei de citire este O(1).
ntotdeauna vor fi generate 2
N
numere, deci ordinul de complexitate al operaiei de
generare a acestora este O(2
N
).
Scrierea datelor n fiierul de ieire este realizat pe parcursul determinrii acesto-
ra, deci operaia de scriere nu consum timp suplimentar.
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(1) + O(2
N
) = O(2
N
).

1.3.2. Triunghi
Pentru fiecare punct dat va trebui s verificm dac se afl sau nu n interiorul triun-
ghiului considerat i s numrm punctele din interiorul triunghiului.
O variant mai simpl de rezolvare se bazeaz pe faptul c dac un punct se afl n
interiorul triunghiului, pe una din laturi sau este un vrf, atunci suma ariilor celor trei
triunghiuri determinate de punctul respectiv i perechi de vrfuri ale triunghiului dat
este egal cu aria triunghiului dat (vezi figura urmtoare).


Aadar, pentru fiecare punct n parte vom determina ariile triunghiurilor determina-
te de punctul respectiv i dou vrfuri ale triunghiului. Dac suma celor trei arii este
egal cu aria triunghiului, atunci punctul se afl n interiorul triunghiului.
Se observ c dac punctul este un vrf al triunghiului, dou dintre cele trei arii vor
fi egale cu 0, iar cea de-a treia arie va fi chiar aria triunghiului dat.
38 Soluiile problemelor propuse la Olimpiadele de Informatic



n cazul n care vrful se afl pe una dintre laturi (dar nu este un vrf al triunghiu-
lui), atunci una dintre arii va fi egal cu 0.
Dac se cunosc coordonatele vrfurilor unui triunghi, atunci formula de calcul a
ariei acestuia este:
1
1
1
2
1
3 3
2 2
1 1
y x
y x
y x
.
n final vom scrie n fiierul de ieire numrul punctelor aflate n interiorul triun-
ghiului.

Analiza complexitii
Citirea coordonatelor vrfurilor triunghiului const n citirea a ase numere ntregi,
deci se realizeaz n timp constant.
Verificarea faptului dac un punct se afl sau nu n interiorul triunghiului conside-
rat se realizeaz cu ajutorul unui numr constant de operaii aritmetice. Aceast opera-
ie poate fi realizat pe msura citirii coordonatelor punctelor. Aadar, ordinul de
complexitate al operaiilor de citire a datelor i determinare a soluiei este O(N).
Datele de ieire constau ntr-un singur numr, aadar ordinul de complexitate al
operaiei de scriere a acestora este O(1).
n concluzie, algoritmul de rezolvare a acestei probleme are ordinul de complexita-
te O(1) + O(N) + O(1) = O(N).

1.3.3. Guri
Vom determina toate regiunile formate din zerouri i vom eticheta elementele acestor
regiuni folosind numere naturale, ncepnd cu 1.
Pentru fiecare regiune determinat vom pstra dimensiunile acestora (numrul de
elemente) ntr-un vector ai crui indici sunt numerele folosite pentru etichetarea di-
mensiunilor regiunilor. Pentru a determina aceste regiuni vom folosi un simplu algo-
ritm de umplere.
O gaur poate fi privit ca fiind o regiune format din zerouri care nu conine nici
un element aflat pe marginea matricei. Vom parcurge cele patru margini ale matricei i
vom seta la 0 dimensiunile tuturor regiunilor care conin elemente de pe aceste mar-
gini. Astfel, practic am eliminat toate regiunile care nu sunt guri.
n final vom parcurge vectorul dimensiunilor i vom determina elementul care are
valoarea maxim. Valoarea acestui element va fi scris n fiierul de ieire.

Analiza complexitii
Datele de intrare constau n dimensiunile matricei i valorile tuturor elementelor aces-
teia. Aadar ordinul de complexitate al operaiei de citire este O(M N).
OLI Cluj-Napoca 2003 39


Operaia de determinare a regiunilor formate din zerouri folosind un algoritm de
umplere are ordinul de complexitate O(M N).
Pentru a elimina regiunile care nu sunt guri vom parcurge cele patru margini ale
matricei, aadar aceast operaie are ordinul de complexitate O(M) + O(N) + O(M) +
O(N) = O(M + N).
n total pot exista cel mult [M N / 2] + 1 regiuni (dac matricea are aspectul unei
table de ah). Aadar, operaia de determinare a dimensiunii celei mai mari regiuni are
ordinul de complexitate O(M N).
Datele de ieire constau ntr-un singur numr, operaia de scriere a acestuia avnd
ordinul de complexitate O(1).
n concluzie, algoritmul de rezolvare a acestei probleme are ordinul de complexita-
te O(M N) + O(M N) + O(M + N) + O(M N) + O(1) = O(M N).
1.3.4. Exponent
Pentru a determina valoarea k, va trebui, mai nti s descompunem numrul n n fac-
tori primi. Pentru fiecare factor p care apare n descompunerea lui n, va trebui s de-
terminm puterea la care apare acest factor n descompunerea n factori primi a valorii
m!. Vom considera c p apare n descompunerea n factori primi a numrului n de u
ori; cu alte cuvinte, n poate fi scris sub forma n = p
u
q, unde q este un numr ntreg.
Vom determina acum puterea v la care apare p n descompunerea n factori primi a
numrului m!. Valoarea v poate fi obinut astfel:
pentru fiecare multiplu al lui p mai mic sau egal cu m, numrul p apare o dat n
descompunerea lui m!;
pentru fiecare multiplu al lui p
2
mai mic sau egal cu m, numrul p apare nc o
dat n descompunerea lui m!;
n general, pentru fiecare multiplu al lui p
i
mai mic sau egal cu m, numrul p apare
nc o dat n descompunerea lui m!.
Expresia pentru fiecare multiplu al lui p
2
mai mic sau egal cu m este echivalent cu
expresia pentru fiecare multiplu al lui p mai mic sau egal cu [m / p].
n general, expresia pentru fiecare multiplu al lui p
i
mai mic sau egal cu m este
echivalent cu expresia pentru fiecare multiplu al lui p mai mic sau egal cu [m / p
i-1
].
Ca urmare, valoarea v la care apare p n descompunerea n factori primi a numru-
lui m! poate fi determinat folosind urmtorul algoritm:
...
v 0
ct timp m > 0 execut
v v + [m / p]
m [m / p]
sfrit ct timp
...
40 Soluiile problemelor propuse la Olimpiadele de Informatic



n aceste condiii, pentru ca n
k
= p
uk
q
k
s fie divizor al numrului m!, trebuie s
avem k [v / u].
Vom determina valorile maxime ale numrului k pentru toi divizorii p i o vom
alege pe cea mai mic dintre acestea.

Analiza complexitii
Intrarea const n citirea a dou numere, aadar ordinul de complexitate al operaiei de
citire a datelor este O(1).
Operaia de descompunere n factori primi a unui numr natural n are ordinul de
complexitate O( n ).
Numrul factorilor primi ai valorii n poate fi cel mult [log
2
n]. Pentru un numr m
dat, folosirea algoritmului prezentat pentru determinarea puterii la care apare p n des-
compunerea n factori primi a valorii m! necesit parcurgerea a [log
p
m] pai.
Ca urmare, operaia de determinare a valorii k are ordinul de complexitate O(log m)
O(log n) = O(log m log n).
Ieirea const ntr-un singur numr, aadar ordinul de complexitate al operaiei de
scriere a datelor este O(1).
n concluzie, algoritmul de rezolvare a acestei probleme are ordinul de complexita-
te O(1) + O( n ) + O(log m log n) + O(1) = O( n +log m log n).

1.3.5. Soldai
Se observ c pentru primul bastion va trebui s alegem o submulime a soldailor care
pot duce un numr total de pachete divizibil cu valoarea n. Pentru al doilea bastion,
dintre cei k soldai rmai va trebui s alegem o submulime a soldailor care pot duce
un numr total de pachete divizibil cu valoarea k. Aadar, pentru al doilea bastion
avem aceeai problem pentru o valoare k strict mai mic dect n.
Practic, la fiecare pas vom rezolva aceeai problem pentru valori din ce n ce mai
mici pn n momentul n care nu mai exist nici un soldat.
Aadar, la fiecare pas va trebui s determinm o submulime a unei mulimi cu k
elemente a crei sum s fie divizibil cu k. n acest scop vom folosi principiul cutiei
lui Dirichlet.
Presupunem c, la un moment dat, cei k soldai rmai pot duce a
1
, a
2
, ..., respectiv
a
k
pachete. Vom calcula sumele S
i
= a
1
+ a
2
+ ... + a
i
folosind formula recurent S
1
=
a
1
i S
i
= a
i
+ S
i-1
pentru toate valorile i cuprinse ntre 2 i k.
Potrivit principiului cutiei lui Dirichlet, dac resturile mpririi valorilor S
i
la k
sunt distincte, atunci unul dintre aceste resturi este 0.
Potrivit aceluiai principiu, dac resturile nu sunt distincte, atunci dou dintre aces-
tea sunt egale. Dac resturile mpririi valorilor S
u
i S
v
sunt egale, atunci restul m-
pririi valorii S
v
S
u
la k este 0. Aadar, valoarea a
u+1
+ a
u+2
+ ... + a
v
va fi divizibil
cu k.
OLI Cluj-Napoca 2003 41


n concluzie, va exista ntotdeauna posibilitatea de a alege o submulime a crei
sum s fie divizibil cu k. Dup alegerea acestei submulimi, dac ea nu conine toate
cele k elemente, va trebui s rezolvm aceeai problem pentru o valoare strict mai
mic dect k (elementele mulimii respective sunt eliminate).

Analiza complexitii
Intrarea const n citirea valorilor corespunztoare celor n soldai, deci ordinul de
complexitate al operaiei de citire a datelor este O(n).
La fiecare pas va trebui s determinm sumele S
i
, operaie care are ordinul de com-
plexitate O(k), unde k = O(n) este numrul soldailor rmai la pasul respectiv.
Pe parcursul determinrii sumelor vom pstra i resturile mpririi lor la k, aadar
vom putea identifica elementele care vor fi eliminate pe parcursul determinrii sume-
lor. Eliminarea propriu-zis este realizat n timp liniar. n cazul cel mai defavorabil,
la fiecare pas vom elimina un singur element, aadar putem avea cel mult n pai. Ca
urmare, ordinul de complexitate al operaiei de repartizare a soldailor este O(n) O(n)
= O(n
2
).
Datele de ieire sunt scrise pe parcursul determinrii soluiilor, deci operaia de
scriere a acestora nu consum timp suplimentar.
n concluzie, algoritmul de rezolvare a acestei probleme are ordinul de complexita-
te O(n) + O(n
2
) = O(n
2
).
1.3.6. Graf
Pentru a determina cel mai ndeprtat nod fa de cel identificat prin valoarea 1 va tre-
bui s realizm o parcurgere n lime (Breadth First BF) a grafului.
O astfel de parcurgere implic atingerea nodurilor mai apropiate de nodul 1 nain-
tea atingerii nodurilor mai ndeprtate.
Ca urmare, ultimul nod atins de o astfel de parcurgere va fi ntotdeauna unul dintre
cele mai ndeprtate noduri, chiar dac exist i alte noduri aflate la aceeai distan.
Dup determinarea ultimului nod parcurs vom scrie n fiierul de ieire numrul
su de ordine.

Analiza complexitii
Intrarea const n citirea informaiilor referitoare la cele m muchii ale grafului, deci
ordinul de complexitate al operaiei de citire a datelor este O(m). Pe parcursul citirii
este construit i structura de date n care va fi pstrat graful, deci nu este consumat
timp suplimentar pentru generarea acesteia.
Operaia de parcurgerea n lime a unui graf are ordinul de complexitate O(m).
Datele de ieire constau ntr-un singur numr, aadar ordinul de complexitate al
operaiei de scriere este O(1).
n concluzie, algoritmul de rezolvare a acestei probleme are ordinul de complexita-
te O(m) + O(m) + O(1) = O(m).
42 Soluiile problemelor propuse la Olimpiadele de Informatic



1.4. Soluiile problemelor propuse spre rezolvare la
Olimpiada Naional de Informatic, 2002

1.4.1. Reconstrucie
Rezolvarea acestei probleme este foarte simpl, ea neimplicnd dect parcurgerea pe
coloane a unei matrice, contorizarea unor secvene de zerouri i pstrarea unei statis-
tici referitoare la aceste secvene.
Pentru a determina blocurile necesare, vom determina blocurile pe fiecare coloan
(datorit faptului c limea unui bloc este ntotdeauna 1 i toate blocurile sunt dispuse
pe vertical, un bloc poate ocupa o singur coloan).
Pentru a determina blocurile de pe o coloan va trebui s determinm secvenele de
zerouri de pe coloana respectiv. Vom lua n considerare doar secvenele de lungime
maxim pentru a minimiza numrul total de blocuri. De exemplu, dac avem ase ze-
rouri consecutive, am putea folosi un bloc de lungime 6, dar i dou blocuri de lungi-
me 5 i 1, 4 i 2 etc. Evident, este obligatoriu s folosim un singur bloc pentru ca nu-
mrul total al blocurilor utilizate s fie minim.
Aadar, pentru fiecare coloan vom determina lungimile secvenelor de zerouri. O
secven de zerouri poate ncepe fie pe prima linie a coloanei, fie n momentul n care
ntlnim o linie pe care se afl un element cu valoarea 0, n timp ce pe linia anterioar
se afl un element cu valoarea 1. Secvena se va termina fie la terminarea parcurgerii
coloanei (se ajunge pe ultima linie a acesteia), fie n momentul n care ntlnim o linie
pe care se afl un element cu valoarea 1, n timp ce pe linia anterioar se afl un ele-
ment cu valoarea 0.
n momentul detectrii terminrii unei secvene (presupunem c lungimea acesteia
este x), numrul blocurilor de lungime x este incrementat. Pentru pstrarea numrului
de blocuri se utilizeaz un ir a, unde a
x
indic numrul blocurilor de lungime x.
La sfrit, vom afia statistica cerut pe baza datelor pstrate n irul a. Vor fi afia-
te toate perechile de forma i a
i
care respect condiia a
i
0.

Analiza complexitii
Datorit faptului c numrul de elemente care compun o secven de zerouri poate fi
determinat pe msur ce se parcurge secvena, ntregul algoritm const ntr-o singur
traversare a matricei. Ordinul de complexitate al unei astfel de traversri este O(m n),
unde m reprezint numrul de linii ale matricei, iar n reprezint numrul de coloane.
Pentru citirea datelor, matricea este parcurs o singur dat, deci ordinul de
complexitate al acestei operaii este tot O(m n).
ONI 2002 43


Pentru afiarea datelor se parcurge o singur dat irul a; acesta nu poate conine
mai mult de m elemente, deoarece nu pot fi folosite blocuri mai nalte dect nlimea
zidului. Aadar, scrierea soluiei are ordinul de complexitate O(m).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(m n) + O(m n) + O(m) = O(m n).
1.4.2. Pod
Rezolvarea problemei se bazeaz pe o variant simpl a metodei programrii dinami-
ce. Se observ foarte uor c numrul de posibiliti de a ajunge pe cea de-a i-a scn-
dur depinde doar de numrul de posibiliti de a ajunge pe cele trei scnduri aflate n
faa ei. Vom nota cu t
i
numrul de posibiliti de a ajunge pe cea de-a i-a scndur.
Vom considera malul opus ca fiind cea de-a (N + 1)-a scndur, unde N este numrul
scndurilor care formeaz podul. Soluia problemei va fi dat de valoarea t
N+1
.
n cazul n care cea de-a i-a scndur lipsete, pe ea nu se poate ajunge, deci vom
avea t
i
= 0.
n cazul n care aceast scndur exist, dar este deteriorat, pe ea se poate ajunge
doar de pe scndura precedent, deci vom avea t
i
= t
i-1
.
n cazul n care scndura exist i nu este deteriorat, pe ea se poate ajunge de pe
scndura anterioar (chiar dac este deteriorat) sau de pe oricare dintre precedentele
dou (dac nu sunt deteriorate). Pentru a exprima relaia matematic pentru t
i
, vom
folosi funcia i definit prin s
i
= t
i
,dac a i-a scndur exist i nu este deteriorat i s
i

= 0 n caz contrar. Folosind aceast funcie, relaia este t
i
= s
i-3
+ s
i-2
+ t
i-1
.
Iniial, vom avea t
0
= 1, deoarece se poate spune c exist o singur posibilitate de
a ajunge pe malul pe care ne aflm.
Datorit faptului c valorile t
i
pot avea pn la 80 de cifre, este necesar simularea
operaiei de adunare pentru numere mari.
Determinarea unei soluii corecte se poate realiza destul de uor dac, la fiecare
pas, pstrm indicele unei scnduri anterioare de pe care se poate trece pe scndura
curent. Acest indice va fi fie cel al scndurii anterioare (dac aceasta exist i num-
rul posibilitilor de a ajunge la ea este nenul), fie al uneia dintre precedentele dou
(dac exist, nu este deteriorat i numrul posibilitilor de a ajunge la ea este nenul).
Dac valoarea t
N+1
este nenul, atunci exist cu siguran cel puin o soluie. n final,
modalitatea de traversare va fi generat cu ajutorul unei tehnici recursive foarte sim-
ple.

Analiza complexitii
Operaia de adunare a numerelor mari are ordinul de complexitate O(NCif), unde NCif
este numrul de cifre al celui mai mare dintre numerele care se adun. Deoarece NCif
este cel mult 80, ordinul de complexitate al operaiei de adunare poate fi considerat a
fi O(80) = 80 O(1) = O(1).
44 Soluiile problemelor propuse la Olimpiadele de Informatic



Trebuie efectuate cel mult 2 N astfel de adunri, deci operaia de determinare a
valorilor t
i
are ordinul de complexitate O(N) O(1) = O(N).
Pentru reconstituirea drumului, la fiecare pas trebuie pstrat indicele unei scnduri
precedente de pe care se poate ajunge pe scndura curent. Exist doar trei posibiliti
de a ajunge pe scndura curent, deci ordinul de complexitate al acestei operaii este
O(1). Pentru determinarea scndurii anterioare corespunztoare fiecrei scnduri din
componena podului sunt efectuate O(N) astfel de operaii, deci ordinul de complexita-
te al operaiei de determinare a unei modaliti de traversare este O(N).
Citirea datelor de intrare se realizeaz ntr-un timp cu ordinul de complexitate
O(N), deoarece pot exista cel mult N 1 scnduri care lipsesc i cel mult N care sunt
deteriorate.
Scrierea datelor de ieire const n generarea unei modaliti de traversare (care are
lungimea cel mult N) i a numrului modalitilor de traversare. Deoarece determina-
rea scndurii precedente se realizeaz pe baza unor indici pstrai pentru fiecare scn-
dur n parte, ordinul de complexitate al acestei operaii este O(1). Datorit faptului c
vor fi cel mult N astfel de determinri, ordinul de complexitate al operaiei de deter-
minare a modalitii de traversare este O(N). Scrierea numrului posibilitilor de tra-
versare poate fi considerat a fi o operaie elementar, deci are ordinul de complexitate
O(1). Aadar, ordinul de complexitate al operaiei de scriere a datelor de ieire este
O(N) + O(1) = O(N).
n concluzie, algoritmul de rezolvare al acestei probleme are ordinul de complexi-
tate O(N) + O(N) + O(N) + O(N) = O(N).

1.4.3. Suma
Pentru ca numrul termenilor s fie minim, trebuie ca suma termenilor care apar cu
semn negativ s fie ct mai mic posibil.
Iniial vom presupune c nu va trebui s scdem nici o valoare i ne propunem s
gsim cel mai mic numr N pentru care:
S i S
N
i
N
=

=1
.

Valoarea N se obine rezolvnd ecuaia de gradul II S
N
= S (vom avea S
N
S + N) i
rotunjind prin adaos rdcina pozitiv obinut. Avem:
.
2
1 8 1
0 2
2
) 1 (
2
+
=
= +
=
+
S
N
S N N
S
N N


ONI 2002 45


Aadar, valoarea N este:

+
=
2
1 8 1 S
N .

Datorit faptului c N este cea mai mic valoare pentru care suma atinge sau dep-
ete valoarea S, soluia problemei nu poate fi dat de nici un numr N' < N. n cele ce
urmeaz vom demonstra c soluia problemei este dat de N, N + 1 sau N + 2.
Se observ c numerele S
N
, S
N+1
i S
N+2
nu pot avea toate aceeai paritate, deoarece
N + 1 i N + 2 au pariti diferite. Vom nota prin D
N
diferena dintre valoarea S
N
i va-
loarea care trebuie obinut (S). Deoarece se scade aceeai valoare din S
N
, S
N+1
i S
N+2
,
este evident c D
N
, D
N+1
i D
N+2
nu pot avea toate aceeai paritate.
Soluia problemei este dat de indicele celui mai mic numr par dintre aceste trei
numere; fie acest indice N'. Suma total a elementelor crora trebuie s le fie modificat
semnul este D
N'
/ 2. Prin modificarea semnului unui element, valoarea expresiei scade
cu dublul acestui element, deci avem S
N'
D
N'
/ 2 2 = S.
Fie x = D
N'
/ 2 (suma total a elementelor care trebuie sczute). Deoarece N' N +
2, obinem S
N'
S
N
+ N + 1 + N + 2. Folosind relaia S
N
S + N, se obine relaia S
N'

S + 3 N + 3. Cu alte cuvinte, avem:
.
2
3 3
2
3 3 +

' N N
x


Aadar, valoarea x poate fi obinut alegnd doar dou numere cuprinse ntre 1 i N'.
n cazul n care x > N' vom scdea N' i N' x, iar n caz contrar vom scdea doar x.

Analiza complexitii
Valoarea N poate fi obinut folosind o simpl formul matematic, deci ordinul de
complexitate al acestei operaii este O(1).
Valorile S
N
, S
N+1
, S
N+2
, D
N
, D
N+1
, D
N+2
sunt calculate tot cu ajutorul unor formule
matematice simple, aadar ordinul de complexitate al operaiei de determinare a aces-
tora este tot O(1).
Identificarea valorii N' se face pe baza verificrii paritii a cel mult trei numere,
deci i aceast operaie are ordinul de complexitate O(1).
Determinarea valorii x i a celor cel mult dou numere crora li se va modifica
semnul este realizat tot pe baza unor calcule simple al cror ordin de complexitate
este O(1).
n concluzie, ordinul de complexitate al unui algoritm eficient de rezolvare a aces-
tei probleme este O(1) + O(1) + O(1) + O(1) = O(1).


46 Soluiile problemelor propuse la Olimpiadele de Informatic



1.4.4. Becuri
Este evident c pentru a obine prima linie a matricei, conform cerinelor, nu putem
dect fie s comutm toate coloanele pe care trebuie s se afle becuri aprinse i s nu
comutm prima linie, fie s comutm prima linie i s comutm toate coloanele pe
care trebuie s se afle becuri stinse. Analog, pentru prima coloan putem fie s comu-
tm toate liniile pe care trebuie s se afle becuri aprinse i s nu comutm prima co-
loan, fie s comutm prima coloan i s comutm toate liniile pe care trebuie s se
afle becuri stinse. Astfel avem patru posibiliti de a obine configuraia cerut:
comutm liniile crora le corespund becuri aprinse pe prima coloan i coloanele
crora le corespund becuri aprinse pe prima linie;
comutm liniile crora le corespund becuri aprinse pe prima coloan i coloanele
crora le corespund becuri stinse pe prima linie;
comutm liniile crora le corespund becuri stinse pe prima coloan i coloanele
crora le corespund becuri aprinse pe prima linie;
comutm liniile crora le corespund becuri stinse pe prima coloan i coloanele
crora le corespund becuri stinse pe prima linie.

Vom verifica fiecare dintre aceste patru variante i apoi o vom alege pe cea care
implic cele mai puine comutri de linii i coloane.
Dac nici una dintre cele patru variante nu duce la obinerea configuraiei cerute,
putem trage concluzia c aceasta nu poate fi obinut prin comutarea unor linii i a
unor coloane.

Analiza complexitii
Citirea datelor de intrare implic parcurgerea unei matrice ptratice, deci ordinul de
complexitate al acestei operaii este O(N
2
).
Verificarea fiecreia dintre cele patru posibiliti de a obine soluia implic par-
curgerea primei linii i a primei coloane; ordinul de complexitate al unei astfel de par-
curgere este O(N) + O(N) = O(N). Pentru fiecare element este posibil ca linia/coloana
corespunztoare s fie comutat. Operaia de comutare implic traversarea liniei sau
coloanei, aadar are ordinul de complexitate O(N). Ca urmare, ordinul de complexitate
al fiecreia dintre cele patru posibiliti este O(N) O(N) = O(N
2
). ntreaga operaie de
determinare a soluiei are ordinul de complexitate 4 O(N
2
) = O(N
2
).
Scrierea datelor de ieire implic traversarea irurilor care indic dac o linie sau
coloan a fost comutat; ordinul de complexitate al operaiei este O(N).
n concluzie, algoritmul de rezolvare al acestei probleme are ordinul de comple-
xitate O(N
2
) + O(N
2
) + O(N) = O(N
2
).

ONI 2002 47


1.4.5. Discuri
Pentru identificarea discurilor dispensabile va trebui s determinm atingerile dintre
discurile care influeneaz limea figurii. De exemplu, dac avem ase discuri, cu raze
de 1000, 1, 2, 3, 1000, respectiv 500, atunci atingerile care influeneaz limea figurii
sunt ntre primul i al cincilea disc, respectiv ntre al cincilea i al aselea.
Pentru fiecare disc i vom determina, pe rnd, coordonatele orizontale pe care le-ar
avea discul dac ar atinge unul dintre discurile anterioare. n final, vom alege discul
(sau axa Oy) pentru care coordonata orizontal a centrului noului disc este maxim i
putem afirma c discul i ajunge n aceast poziie. Dac discul i va atinge un disc ante-
rior j, atunci discurile cu numerele de ordine cuprinse ntre j + 1 i i 1 sunt
dispensabile.
Dup ce vom lua n considerare toate cele N discuri, vom putea determina numere-
le de ordine ale tuturor discurilor dispensabile.
n final vom verifica dac exist discuri introduse la sfrit care sunt dispensabile.
Pentru aceasta vom determina limea figurii i ultimul disc care o influeneaz. Toate
discurile introduse dup acest disc sunt dispensabile.
Pentru determinarea coordonatei orizontale x
i
a centrului unui disc i care atinge un
disc j avem nevoie de coordonata orizontal x
j
a centrului discului j, precum i de raze-
le r
i
i r
j
ale celor dou discuri.
Dac aceste trei valori sunt cunoscute, se poate folosi urmtoarea formul pentru a
determina coordonata orizontal a centrului discului j:
2 2
) ( ) (
j i j i i j
r r r r x x + + =
.

Analiza complexitii
Pentru fiecare disc i care este introdus, se determin posibila coordonat x
i
datorat
atingerii cu toate cele i 1 discuri inserate anterior. Pentru cele N discuri se vor de-
termina, n total, N (N + 1) / 2 coordonate, deci ordinul de complexitate al acestei
operaii este O(N
2
).
La fiecare pas, pot fi marcate ca dispensabile cel mult toate discurile inserate ante-
rior, aadar ordinul de complexitate al acestei operaii este tot O(N
2
).
Determinarea limii figurii i a cercurilor dispensabile de la sfritul secvenei ne-
cesit o singur parcurgere a irului care pstreaz coordonatele centrelor discurilor,
ceea ce implic ordinul de complexitate O(N).
Afiarea cercurilor dispensabile, precum i citirea razelor cercurilor sunt operaii
care se efectueaz n timp liniar, necesitnd o simpl parcurgere a unor iruri.
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(N
2
) + O(N
2
) + O(N) + O(N) + O(N) = O(N
2
).

48 Soluiile problemelor propuse la Olimpiadele de Informatic



1.4.6. Cod
Din condiiile precizate n enun rezult c, pe baza unei mulimi de litere distincte, se
poate construi un singur cuvnt care respect condiiile date, i anume cel care conine
literele ordonate lexicografic. Aadar, oricrei mulimi de cel mult zece litere distincte
i corespunde un cuvnt care respect condiiile din enun. Se poate afirma c un cu-
vnt este o submulime a mulimii literelor; de aici rezult c numrul cuvintelor for-
mate din k litere este
k
C
26
. Mai mult, numrul cuvintelor formate din k dintre ultimele
n litere ale alfabetului este
k
n
C
.
Numrul de ordine al cuvntului dat este mai mare dect cel al codurilor formate
din mai multe cifre. Din aceste motive, pentru un cuvnt format din k litere, vom avea
un cod mai mare dect

=
k
i
i
C
1
26
.
n continuare, pentru prima liter a cuvntului, va trebui s gsim numrul cuvinte-
lor care ncep cu o liter mai mic (din punct de vedere lexicografic). n cazul n care
cuvntul are k litere, vor exista
1
25
k
C
cuvinte valide care ncep cu 'a',
1
24
k
C
cuvinte va-
lide care ncep cu 'b' etc. n general, vor exista
1
26

k
i
C
cuvinte valide care ncep cu a i-a
liter a alfabetului. Dac prima liter a cuvntului este cea de-a n-a liter a alfabetului,
vom avea

n
i
k
i
C
1
1
26
cuvinte valide care ncep cu o liter mai mic.
n acest moment tim numrul de ordine minim al unui cuvnt care ncepe cu prima
liter a cuvntului dat. Pentru a doua liter vom proceda ntr-o manier asemntoare.
Singura diferen este dat de faptul c a doua liter trebuie s fie strict mai mare dect
prima. Aadar, dac prima liter este cea de-a n-a a alfabetului, iar a doua este cea de-a
m-a, atunci vom avea

+ =

1
1
2
26
m
n i
k
i
C
cuvinte care au pe prima poziie aceeai liter, iar pe
cea de-a doua poziie o liter mai mic.
Procedeul va continua pentru fiecare liter n parte. n cazul n care litera curent
este cea de-a p-a a cuvntului, este a m-a liter a alfabetului, iar litera anterioar este a
n-a liter a alfabetului, numrul de cuvinte care au pe primele p 1 poziii aceleai
litere ca i cuvntul dat, iar pe cea de-a p-a poziie o liter mai mic, este dat de for-
mula

+ =

1
1
26
m
n i
p k
i
C
.
Adunnd toate valorile obinute pe parcurs vom obine numrul cuvintelor care se
afl naintea cuvntului dat. Adunnd 1 la aceast valoare, vom obine numrul de or-
dine al cuvntului.


ONI 2002 49


Analiza complexitii
Pentru a analiza complexitatea acestui algoritm va trebui s precizm faptul c num-
rul literelor din alfabet este constant, deci nu poate interveni n exprimarea ordinului
de complexitate. Acesta va fi stabilit doar n funcie de lungimea k a cuvntului.
Iniial se calculeaz suma

=
k
i
i
C
1
26
, operaie realizabil n timp liniar, avnd n vede-
re observaia anterioar. Aadar, primul pas al algoritmului are ordinul de complexita-
te O(k).
Pentru fiecare liter a cuvntului se calculeaz suma

+ =

1
1
2
26
m
n i
k
i
C
, unde variabilele au
semnificaia prezentat anterior. Numrul de litere este implicat n determinarea valo-
rii combinrii. Aadar, calculul combinrii se realizeaz n timp liniar. Numrul de
combinri calculate nu depinde de lungimea cuvntului, deci ordinul de complexitate
al calculrii acestei sume este O(k). n total vor fi calculate k astfel de sume, deci ordi-
nul de complexitate al celui de-al doilea pas al algoritmului este O(k) O(k) = O(k
2
).
Citirea datelor de intrare i scrierea celor de ieire se realizeaz cu ajutorul unor
operaii elementare, deci putem considera c au ordinul de complexitate O(1).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(k) + O(k
2
) + O(1) = O(k
2
), avnd n vedere c numrul literelor din alfabetul
englez este constant.

1.4.7. Hotel
Pentru nceput, vom determina numrul de etaje la care exist angajai i vom atribui
fiecrui etaj cte o culoare. Pe msur ce citim datele referitoare la angajai, vom veri-
fica dac etajul la care lucreaz angajatul are asociat o culoare i, dac este cazul, i
vom atribui o culoare i vom crete numrul etajelor distincte. Dac ajungem n situa-
ia n care numrul culorilor disponibile este mai mic dect numrul etajelor distincte,
atunci problema nu are soluie. Atribuind cte o culoare fiecrui etaj, practic, am re-
zolvat cea de-a doua parte a problemei.
Pentru prima parte vom considera c avem la dispoziie n culori i exist k etaje
distincte la care lucreaz angajai. Va trebui s determinm numrul de posibiliti de
a atribui celor k etaje cte o culoare, astfel nct fiecare etaj s aib propria sa culoare.
Practic, avnd la dispoziie o mulime format din n elemente va trebui s determi-
nm cte posibiliti de alegere a k dintre aceste elemente exist. Este foarte uor de
observat c, de fapt, propoziia anterioar reprezint definiia noiunii matematice de
aranjamente. Aadar, soluia primei pri a problemei este dat de formula:
. ) 1 ( ) 2 ( ) 1 (
)! (
!
n n k n k n
k n
n
A
k
n
+ + =

= L


50 Soluiile problemelor propuse la Olimpiadele de Informatic



Datorit faptului c se obin numere foarte mari, nu se pot folosi tipurile de date
puse la dispoziie de limbajele de programare pentru operaii aritmetice. Se observ c,
folosind formula anterioar, avem nevoie doar de nmuliri dintre un numr mare i un
numr cel mult egal cu 200. Ca urmare, va trebui s implementm operaia de nmuli-
re a unui numr mare cu un scalar. Pentru a mri viteza de execuie a programului i a
utiliza mai eficient memoria, se poate folosi baza 10000 pentru efectuarea calculelor.

Analiza complexitii
Citirea datelor de intrare se realizeaz n timp liniar, deci ordinul de complexitate al
acestei operaii este O(n).
Verificarea faptului c unui etaj i corespunde o culoare i eventuala atribuire a unei
culori se realizeaz n timp constant. Deoarece aceast operaie se realizeaz pentru
etajul corespunztor fiecrui angajat, stabilirea corespondenei dintre etaje i culori se
realizeaz ntr-un timp cu ordinul de complexitate O(n) O(1) = O(n).
Calcularea numrului de modaliti de alegere a culorilor implic folosirea numere-
lor mari. Se observ c numrul de cifre (n baza 10000) al rezultatului este mai mic
dect 100, aadar putem considera c o nmulire se realizeaz n timp liniar. Numrul
nmulirilor efectuate este k, deci ordinul de complexitate al operaiei de determinare a
rezultatului este O(k).
Afiarea numrului de modaliti este realizat n timp constant, iar operaia de afi-
are a culorilor corespunztoare fiecrui angajat are ordinul de complexitate O(n).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(n) + O(n) + O(k) + O(1) + O(n) = O(k + n).
1.4.8. Lac
Pentru rezolvarea acestei probleme vom folosi o variant puin modificat a algorit-
mului lui Lee. Pentru fiecare poziie a matricei care reprezint o zon mltinoas vom
determina numrul minim de pontoane care trebuie s fie amplasate pentru a se ajunge
n poziia respectiv.
Pentru aceasta vom considera c pentru a ajunge n imediata vecintate a primei
linii a matricei numrul de pontoane necesare este 0. Pentru o anumit poziie, num-
rul de pontoane necesare ajungerii n punctul respectiv este dat de cel mai mic numr
corespunztor uneia dintre poziiile nvecinate la care se adaug, eventual, un ponton
dac poziia nu corespunde unei poriuni de uscat.
Dup o astfel de parcurgere a matricei, vom avea pentru fiecare poziie a matricei o
anumit valoare, dar nu suntem siguri c aceasta este cea minim. Vom parcurge suc-
cesiv matricea ncercnd s mbuntim valorile obinute. O valoare va fi modificat
dac se poate ajunge n poziia curent dintr-o poziie nvecinat i se obine un numr
mai mic de pontoane pentru poziia curent. n momentul n care nu va mai exista nici
o parcurgere care s aduc mbuntiri, am obinut rezultatul final.
ONI 2002 51


Practic cele dou tipuri de parcurgeri pot fi "asimilate" n una singur dac, iniial,
se marcheaz toate poziiile matricei cu o valoare suficient de mare. De fiecare dat
cnd are loc o mbuntire, vom pstra direcia din care s-a ajuns n poziia curent
pentru a putea reconstitui drumul.
n final, numrul minim de pontoane va fi dat de cea mai mic valoare de pe ultima
linie a matricei. Pentru reconstituirea drumului, se va porni n sens invers, de pe pozi-
ia de pe ultima linie n poziia din care s-a ajuns n ea i aa mai departe, pn se
ajunge pe prima linie. Dac se ajunge ntr-o poziie care nu corespunde unei zone de
uscat, atunci va trebui amplasat un ponton n acea poziie.

Analiza complexitii
Citirea datelor de intrare implic o traversare a matricei, ordinul de complexitate al
acestei operaii fiind O(m n).
O parcurgere a matricei n vederea realizrii unei mbuntiri are acelai ordin de
complexitate. Datorit faptului c, dup prima parcurgere, suntem siguri c se poate
ajunge pe ultima linie folosind m pontoane (completarea integral a coloanei), nu se
vor realiza n nici o situaie mai mult de m parcurgeri de mbuntire. Din aceste mo-
tive, ordinul de complexitate al operaiei de determinare a numrului de pontoane ne-
cesare pentru ajungerea n fiecare poziie este O(m) O(m n) = O(m
2
n).
Determinarea valorii minime de pe ultima linie se realizeaz n timp liniar, ordinul
de complexitate fiind O(n).
Reconstituirea drumului ar putea, teoretic, s necesite traversarea ntregii matrice.
Astfel, n cel mai defavorabil caz, ordinul de complexitate al acestei operaii este O(m
n).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(m n) + O(m
2
n) + O(n) + O(m n) = O(m
2
n).

1.4.9. Logic
Pentru nceput vom observa c, pentru ca trasarea s fie posibil, fiecare zon trebuie
s fie delimitat de un numr par de segmente. Aceasta se datoreaz faptului c linia
trebuie s intre i s ias din fiecare zon de un anumit numr de ori.
Aadar, pentru fiecare zon va trebui s numrm segmentele (aa cum sunt defini-
te ele n enun) care o delimiteaz i s verificm dac numrul obinut este par sau
impar. n momentul n care gsim o zon delimitat de un numr par de segmente,
vom ti c trasarea nu este posibil. Dac toate zonele sunt delimitate de un numr par
de segmente, atunci trasarea este posibil.
Numrarea segmentelor care delimiteaz o zon se realizeaz pe baza unui algo-
ritm de umplere. n momentul n care ajungem la un punct de la marginea zonei, se
pune problema creterii numrului de segmente. Exist mai multe situaii n care nu-
mrul de segmente va crete:
52 Soluiile problemelor propuse la Olimpiadele de Informatic



se ajunge n partea de sus a zonei, iar punctul aflat imediat deasupra i cel din
dreapta acestuia fac parte din zone diferite;
se ajunge n partea de jos a zonei, iar punctul aflat imediat dedesubt i cel din
dreapta acestuia fac parte din zone diferite;
se ajunge n partea din stnga a zonei, iar punctul aflat imediat la stnga i cel de
deasupra sa fac parte din zone diferite;
se ajunge n partea din dreapta a zonei, iar punctul aflat imediat la dreapta i cel de
deasupra sa fac parte din zone diferite;
se ajunge ntr-unul din colurile zonei.

Dac ultima condiie este ndeplinit simultan cu una dintre primele patru, numrul
segmentelor va crete doar cu 1. Creterile datorate primelor patru condiii sunt cumu-
lative.

Analiza complexitii
Vom studia acum complexitatea algoritmului pentru un desen. Citirea datelor de intra-
re implic o traversare a matricei, deci aceast operaie se realizeaz ntr-un timp de
ordinul O(n
2
).
La fiecare pas al algoritmului de umplere se numr segmentele care trebuie adu-
gate pentru poziia curent. Se pot aduga cel mult patru segmente, aadar ordinul de
complexitate al operaiei este O(1). Algoritmul de umplere implic parcurgerea inte-
gral a matricei, motiv pentru care vor fi vizitate toate cele n
2
poziii. Aadar, algorit-
mul de verificare a posibilitii de trasare a liniei are ordinul de complexitate O(n
2
)
O(1) = O(n
2
).
Datele de ieire constau din scrierea unui singur mesaj, deci aceast operaie se
efectueaz n timp liniar.
n concluzie, algoritmul de rezolvare a acestei probleme, pentru un desen, are ordi-
nul de complexitate O(n
2
) + O(n
2
) + O(1) = O(n
2
).
Pentru a stabili ordinul de complexitate al algoritmului de rezolvare a ntregii pro-
bleme, vom considera c un set de date cuprinde t desene. Aadar, ordinul de comple-
xitate este O(t) O(n
2
) = O(n
2
t).
1.4.10. Foto
Se observ foarte uor c exist doar nou posibiliti de lipire a patru fotografii pe o
pagin, indiferent de dimensiunile acestora. Toate celelalte posibiliti sunt echivalen-
te cu una dintre cele nou, ele obinndu-se prin translatri sau oglindiri. Cele nou
aranjamente posibile pe care le vom lua n considerare sunt prezentate n figura urm-
toare.
ONI 2002 53



Modaliti de amplasare

Va trebui s alegem poziiile celor patru fotografii pentru fiecare dintre cele nou
configuraii. Teoretic, pentru fiecare dintre cele nou configuraii, exist 4! = 24 posi-
biliti. Practic, se observ c exist i n acest caz configuraii echivalente. De exem-
plu, pentru prima i a doua configuraie, nu conteaz ordinea n care sunt aezate foto-
grafiile, pentru a treia configuraie nu conteaz ordinea n care sunt dispuse cele trei
poze de pe a doua coloan etc. Practic, pentru fiecare configuraie vom avea 1, 2, 4, 6
sau 12 posibiliti.
Cu excepia ultimei configuraii, n toate celelalte exist o fotografie care ocup o
ntreag latur a paginii. Cunoscnd raportul dintre lungimea i limea sa se determi-
n laturile spaiului liber rmas pe foaie. n continuare, una dintre laturile spaiului
este ocupat integral de o fotografie. Procedura continu pn determinm dimensiunile
tuturor fotografiilor. n final se verific dac foaia este acoperit integral. Pentru ulti-
ma configuraie vom alege, pe rnd, dimensiunile posibile ale fotografiei din colul din
stnga-sus i dimensiunile celorlalte fotografii vor fi determinate n acelai mod ca i
n situaiile anterioare.

Analiza complexitii
Citirea datelor se realizeaz n timp constant, deoarece numrul fotografiilor este n-
totdeauna 4. Studierea primelor opt configuraii se realizeaz, de asemenea, n timp
constant, deoarece numrul posibilitilor de amplasare a fotografiilor respectnd con-
figuraiile considerate este constant.
Pentru cea de-a noua configuraie putem avea cel mult min(X, Y) dimensiuni posi-
bile ale primei fotografii, unde X i Y sunt dimensiunile paginii. Dac notm cu n acest
minim, ordinul de complexitate al acestei operaii va fi O(n).
Datele de ieire constau n exact opt numere, deci scrierea rezultatelor se realizeaz
n timp constant.
n concluzie, algoritmul de rezolvare a acestei probleme are ordinul de complexita-
te O(1) + 8 O(1) + O(n) + O(1) = O(n).
54 Soluiile problemelor propuse la Olimpiadele de Informatic



1.4.11. Balan
Se observ c suma momentelor greutilor este cuprins ntre -6000 i 6000 (dac avem
20 de greuti cu valoarea 20 i acestea sunt amplasate pe cel mai ndeprtat crlig fa
de centrul balanei, atunci modulul sumei momentelor forelor este 15 20 20 = 6000).
Ca urmare, putem pstra un ir a ale crui valori a
i
vor conine numrul posibilitilor ca
suma momentelor greutilor s fie i. Indicii irului vor varia ntre -6000 i 6000. Pentru
a mbunti viteza de execuie a programului, indicii vor varia ntre -300 g i 300 g,
unde g este numrul greutilor. Pot fi realizate mbuntiri suplimentare dac se deter-
min distanele maxime fa de mijlocul balanei ale celor mai ndeprtate crlige de pe
cele dou talere i suma total a greutilor. Dac distanele sunt d
1
i d
2
, iar suma este s,
atunci indicii vor varia ntre -d
1
s i d
2
s.
Iniial, pe balan nu este agat nici o greutate, aadar suma momentelor greuti-
lor este 0. Ca urmare, iniial valorile a
i
vor fi 0 pentru orice indice nenul i a
0
= 1
(exist o posibilitate ca iniial suma momentelor greutilor s fie 0 i nu exist nici o
posibilitate ca ea s fie diferit de 0).
n continuare, vom ncerca s amplasm greutile pe crlige. Fiecare greutate poa-
te fi amplasat pe oricare dintre crlige. S presupunem c la un moment dat exist a
i

posibiliti de a obine suma i. Dac vom amplasa o greutate de valoare g pe un crlig
aflat la distana d fa de centrul balanei, suma momentelor greutilor va crete sau
va scdea cu g d (n funcie de braul pe care se afl crligul). Ca urmare, dup am-
plasarea noii greuti exist a
i
posibiliti de a obine suma i + g d. Considerm c
irul b va conine valori care reprezint numrul posibilitilor de a obine sume ale
momentelor forelor dup amplasarea greutii curente. nainte de a testa posibilitile
de plasare a greutii, irul b va conine doar zerouri. Pentru fiecare pereche (i, d), va-
loarea b
i
+ g d va crete cu a
i
. Dup considerarea tuturor perechilor, vom putea trece
la o nou greutate. Valorile din irul b vor fi salvate n irul a, iar irul b va fi reiniia-
lizat cu 0. Rezultatul final va fi dat de valoarea a
0
obinut dup considerarea tuturor
greutilor disponibile.

Analiza complexitii
Pentru studiul complexitii vom nota numrul greutilor cu g, iar cel al crligelor cu c.
Citirea datelor de intrare corespunztoare crligelor i greutilor se realizeaz n
timp liniar, deci ordinul de complexitate al acestor operaii este O(g), respectiv O(c).
Singura mrime care nu este considerat constant i de care depinde numrul de
posibiliti de a obine sumele este numrul greutilor. Aadar, vom considera c or-
dinul de complexitate al traversrii irului a este O(g). Numrul de traversri este dat
tot de numrul greutilor disponibile, deci vom avea O(g) traversri. n timpul traver-
srii vom considera toate crligele pentru fiecare element al irului. Ca urmare, ordinul
de complexitate al operaiilor efectuate asupra unui element ntr-o parcurgere este
O(c). Rezult c ordinul de complexitate al unei parcurgeri este O(g) O(c) = O(g c),
ONI 2002 55


n timp ce ordinul de complexitate al ntregii operaii care duce la obinerea rezultatu-
lui este O(g) O(g c) = O(g
2
c).
Afiarea numrului de posibiliti de a echilibra balana se realizeaz n timp con-
stant.
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(c) + O(g) + O(g
2
c) + O(1) = O(g
2
c).
1.4.12. Aliniere
Pentru fiecare soldat vom determina cel mai lung subir strict cresctor (din punct de
vedere al nlimii) de soldai care se termin cu el, respectiv cel mai lung subir strict
descresctor de soldai care urmeaz dup el. Dup aceast operaie, vom determina
soldatul pentru care suma lungimilor celor dou iruri este maxim.
Chiar dac s-ar prea c n acest mod am gsit soluia problemei, mai exist o posi-
bilitate de a mri numrul soldailor care rmn n ir. S considerm soldatul cel mai
nalt n irul rmas (cel cruia i corespunde suma maxim). Acesta poate privi fie spre
stnga, fie spre dreapta irului. Din aceste motive, la stnga sau la dreapta sa poate s
se afle un soldat de aceeai nlime; unul dintre cei doi va privi spre dreapta, iar cel-
lalt spre stnga. Totui, nu putem alege orice soldat cu aceeai nlime, ci doar unul
pentru care lungimea irului strict cresctor (dac se afl spre stnga) sau a celui strict
descresctor (dac se afl spre dreapta) este aceeai cu lungimea corespunztoare iru-
lui strict cresctor, respectiv strict descresctor, corespunztoare celui mai nalt soldat
dintre cei rmai n ir.
Dup identificarea celor doi soldai de nlimi egale (sau demonstrarea faptului c
nu exist o pereche de acest gen care s respecte condiiile date) se marcheaz toi sol-
daii din cele dou subiruri. Ceilali soldai vor trebui s prseasc formaia.

Analiza complexitii
Citirea datelor de intrare se realizeaz n timp liniar, deci ordinul de complexitate al
acestei operaii este O(n).
Chiar dac exist algoritmi eficieni (care ruleaz n timp liniar-logaritmic) de de-
terminare a celui mai lung subir ordonat, timpul de execuie admis ne permite folosi-
rea unui algoritm simplu, cu ordinul de complexitate O(n
2
). Acesta va fi aplicat de do-
u ori, dup care se va cuta valoarea maxim a sumei lungimilor irurilor corespunz-
toare unui soldat; aadar identificarea soldatului care poate privi n ambele direcii este
o operaie cu ordinul de complexitate O(n
2
) + O(n
2
) + O(n) = O(n
2
).
Urmeaz eventuala identificare a unui alt soldat de aceeai nlime care respect
condiiile referitoare la lungimile subirurilor. Pentru aceasta se parcurge irul soldai-
lor de la soldatul identificat anterior spre extremiti; operaia necesit un timp liniar.
Determinarea celor dou subiruri se realizeaz n timp liniar dac, n momentul con-
struirii celor dou subiruri, se pstreaz predecesorul, respectiv succesorul fiecrui
soldat. n timpul parcurgerii subirurilor sunt marcai soldaii care rmn n formaie.
56 Soluiile problemelor propuse la Olimpiadele de Informatic



Pentru scrierea datelor de ieire se parcurge irul marcajelor i sunt identificai sol-
daii care prsesc formaia. Ordinul de complexitate al acestei operaii este O(n).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(n) + O(n
2
) + O(n) + O(n) + O(n) = O(n
2
).

1.4.13. Arbore
Vom spune c un nod este rezolvat dac i numai dac el face parte din exact un ciclu.
Similar, vom spune c un subarbore este rezolvat dac i numai dac toate nodurile
acestuia sunt rezolvate.
Vom numi fir un subarbore care este lan (fiecare nod, cu excepia frunzei, are un
singur fiu). Un fir este ilustrat n figura 1.

Fig. 1: Un fir

Se observ c un fir poate fi rezolvat foarte simplu prin unirea rdcinii sale cu
frunza sa. Evident, firul va putea fi rezolvat numai dac el conine cel puin dou no-
duri. Procedeul este ilustrat n figura 2.

Fig. 2: Un fir rezolvat


Pentru a rezolva aceast problem vom alege, pentru nceput, un nod care va fi r-
dcina arborelui. Vom spune c un subarbore este potenial rezolvabil dac toi fiii
rdcinii subarborelui (n numr de cel puin doi) sunt rdcini ale unor fire.
n continuare vom arta modul n care poate fi rezolvat un nod potenial rezolvabil.
Vom alege cele mai scurte dou fire (acestea pot conine unul, dou sau mai multe
ONI 2002 57


noduri) i vom uni printr-o muchie frunzele acestor fire. Astfel vom obine un ciclu
care va conine nodurile din componena celor dou fire, precum i nodul potenial
rezolvabil. Eventualele fire rmase (dac sunt formate din cel puin trei noduri) vor fi
rezolvate aa cum s-a artat n figura anterioar. Se observ c, n cazul n care exist
mai mult de dou fire care conin unul sau dou noduri, subarborele nu poate fi rezol-
vat i problema nu are soluie. Rezolvarea unui subarbore potenial rezolvabil este
ilustrat n figura 3.

Fig. 3: Rezolvarea unui subarbore potenial rezolvabil


Dup rezolvarea unui subarbore, acesta este eliminat din arbore i se va alege un alt
nod potenial rezolvabil. Procedeul continu pn la rezolvarea tuturor nodurilor sau
pn la detectarea unui subarbore care nu poate fi rezolvat.
n cele ce urmeaz vom prezenta modul n care poate fi implementat algoritmul
descris. Pentru nceput vom alege o modalitate de reprezentare a arborelui. Vom con-
strui o list de fii i vom pstra, pentru fiecare nod, indicele primului i al ultimului fiu
n aceast list. Prin convenie, vom considera c pentru un nod care nu are nici un fiu
(frunz) indicele ultimului fiu va fi mai mic dect indicele primului fiu; de asemenea,
pentru fiecare nod vom pstra nodul printe. Datorit faptului c arborele este dat prin
irul muchiilor, va trebui s l construim. Pentru aceasta vom realiza o parcurgere n
lime a arborelui, ceea ce permite construirea listei fiilor pe msura traversrii noduri-
lor arborelui.
n continuare vom alege rdcina arborelui; aceasta poate fi orice nod care are gra-
dul mai mare dect 1. Vom continua cu identificarea fiilor; evident, toate frunzele sunt
fire de lungime 1. Pentru fiecare frunz vom "urca n arbore" atta timp ct nodul cu-
rent are un singur fiu (printele frunzei va fi rdcina unui fir de lungime 2, printele
printelui va fi rdcina unui fir de lungime 3 i aa mai departe). Folosind acest pro-
cedeu vom determina i lungimile firelor. Prin convenie, vom considera c dac un
nod nu face parte dintr-un fir, atunci lungimea corespunztoare va fi -1.
Acum, la fiecare pas vom cuta un nod care conine cel puin doi fii nerezolvai
care sunt rdcini ale unor fire. Vom determina numrul firelor de lungime 1 sau 2 i,
58 Soluiile problemelor propuse la Olimpiadele de Informatic



n cazul n care exist cel mult dou astfel de fire, vom rezolva subarborele aa cum se
arat n figura 3. Dac exist mai mult de dou astfel de fire vom scrie n fiierul de
ieire valoarea -1 i vom opri execuia programului. Dup rezolvarea subarborelui,
acesta este eliminat din arbore prin marcarea tuturor nodurilor sale ca fiind rezolvate.
Acum printele rdcinii subarborelui ar putea s fac parte dintr-un fir. n cazul n
care printele a rmas cu un singur fiu care este rdcin a unui fir, atunci printele
devine rdcin a unui fir de lungime cu 1 mai mare. Vom "urca" din nou n arbore
pn la ntlnirea unui nod care are mai muli fii nerezolvai i vom pstra, pentru fie-
care nod, lungimea firului cu rdcina n nodul respectiv. O a doua posibilitate este ca
printele rdcinii subarborelui eliminat s devin frunz. Se va "urca" n arbore n
mod asemntor, dar noua frunz va fi rdcina unui fir de lungime 1.
Exist posibilitatea ca, la un moment dat, s rmnem cu un arbore format dintr-un
singur fir. Dac acesta are lungimea mai mare dect 2, atunci el va fi rezolvat aa cum
se arat n figura 2. n caz contrar, problema nu are soluie.
De fiecare dat cnd rezolvm un subarbore, vom pstra o list cu muchiile adu-
gate. n final, vom scrie n fiierul de ieire numrul muchiilor adugate, precum i
extremitile muchiilor din list.

Analiza complexitii
Citirea datelor de intrare se realizeaz n timp liniar, deoarece implic citirea extremi-
tilor celor N 1 muchii ale arborelui.
Construirea arborelui prin parcurgerea n lime implic, pentru fiecare nod par-
curs, studierea tuturor muchiilor. Deoarece avem N noduri i N 1 muchii, ordinul de
complexitate al operaiei este O(N
2
). Pe parcursul construirii arborelui se creeaz irul
prinilor, cel al fiilor, cel al gradelor, precum i cele care pstreaz indicii primului i
ultimului fiu pentru fiecare nod.
Pentru pstrarea informaiilor iniiale despre fire, vom parcurge, n cel mai defavo-
rabil caz, toate nodurile arborelui, deci operaia se realizeaz n timp liniar. Trebuie
observat faptul c acest ordin de complexitate include i timpul consumat pentru actu-
alizarea necesar dup eliminarea unui nod din arbore.
Alegerea unui nod potenial rezolvabil implic traversarea listei fiilor pentru a veri-
fica dac sunt rdcini ale unor fire, deci ordinul su de complexitate este O(N). La
fiecare pas vom elimina cel puin trei noduri, deci vom realiza cel mult N / 3 astfel de
cutri. Ca urmare, ordinul de complexitate al tuturor alegerilor este O(N
2
).
Pentru rezolvarea arborelui este necesar parcurgerea tuturor nodurilor acestuia. Un
nod rezolvat nu va fi parcurs nc o dat. Aadar, ordinul de complexitate al acestei
operaii este O(N).
Ordinul de complexitate al operaiilor de eliminare a nodurilor este tot O(N) pentru
c fiecare nod este eliminat o singur dat.
Scrierea datelor n fiierul de ieire se realizeaz tot n timp liniar pentru c implic
scrierea extremitilor a cel mult N / 3 muchii.
ONI 2002 59


n concluzie, algoritmul de rezolvare a acestei probleme are ordinul de complexi-
tate O(N) + O(N
2
) + O(N) + O(N
2
) + O(N) + O(N) + O(N) = O(N
2
).

1.4.14. Decodificare
Iniial vom determina numrul de poziii n care permutarea identic i permutarea
care trebuie determinat coincid.
n continuare vom ncerca s determinm poziiile n permutare ale tuturor numere-
lor cuprinse ntre 1 i N. Pentru fiecare numr i, dac poziia sa nu a fost determinat
la un pas anterior, va trebui s determinm poziia acestuia n permutarea cutat. Pen-
tru aceasta, n permutarea identic, vom interschimba, pe rnd, numrul i cu fiecare
dintre celelalte elemente. Astfel, vom obine permutri de forma (1, 2, 3, ..., i - 1, j, i +
1, ..., j - 1, i, j + 1, ..., N). Numrul poziiilor, n care aceast permutare i permutarea
care trebuie considerat coincid, poate crete dac i numai dac numrul i ajunge pe
poziia sa sau numrul care trebuie s se afle pe poziia i ajunge n aceast poziie.
Aadar, pentru doar dou dintre aceste permutri numrul poziiilor considerate poate
s creasc. Exist trei cazuri:
Numrul poziiilor care coincid nu crete n nici un caz. n aceast situaie putem
trage concluzia c numrul i se afl deja pe poziia sa, deci va fi al i-lea element n
permutarea care trebuie determinat.
Numrul poziiilor care coincid crete o singur dat. Fie j numrul cu care a fost
interschimbat i n permutarea care a dus la creterea numrului de poziii care co-
incid. Este uor de observat c, n permutarea care trebuie determinat, numrul i
se va afla pe poziia j, iar numrul j se va afla pe poziia i.
Numrul poziiilor care coincid crete de dou ori. Fie j i k poziiile pe care a
ajuns numrul i n cele dou permutri. Va trebui s determinm pe care dintre
aceste dou poziii se afl i n permutarea care trebuie determinat. tim cu sigu-
ran c unul dintre numerele j i k se afl pe poziia i n permutarea care trebuie
determinat. Va trebui s studiem dou cazuri:
i trece pe poziia j, j pe poziia k i k pe poziia i;
i trece pe poziia k, j pe poziia i i k pe poziia j.

n unul dintre aceste dou cazuri numrul poziiilor care coincid va fi cu cel puin
2 mai mare dect numrul poziiilor care coincid n permutarea identic. Aadar, vom
verifica una dintre permutri; dac numrul poziiilor care coincid crete cu cel puin
2, atunci vom ti care este poziia numrului i n permutarea care trebuie determinat
i care este numrul care se afl pe poziia i n aceast permutare.
Dup determinarea poziiilor tuturor numerelor, vom afia permutarea determinat.



60 Soluiile problemelor propuse la Olimpiadele de Informatic



Analiza complexitii
Pentru nceput, trebuie precizat faptul c apelul funciei Check implic traversarea
unui vector cu N elemente care conine permutarea care trebuie determinat. Aadar
ordinul de complexitate al unui astfel de apel este O(N).
Preluarea dimensiunii irului se realizeaz n timp constant, deci are ordinul de
complexitate O(1).
Identificarea poziiei unui numr implic realizarea a cel mult N 1 interschimbri
i, eventual, a unei permutri care va diferi de permutarea identic n trei poziii. Pen-
tru fiecare dintre aceste permutri se va realiza un apel al funciei Check, deci operaia
de determinare a poziiei unui numr n permutarea cutat are ordinul de complexita-
te O(N) O(N) = O(N
2
). n total, vom efectua cel mult N determinri, deci ordinul de
complexitate al operaiei de determinare a permutrii cutate este O(N) O(N
2
) =
O(N
3
).
Scrierea datelor n fiierul de ieire implic traversarea permutrii determinate, deci
ordinul de complexitate al operaiei este O(N).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(1) + O(N
3
) + O(N) = O(N
3
).

1.4.15. Seti
Pentru a determina numrul de apariii ale cuvintelor din dicionar n mesajul dat, vom
ordona alfabetic toate irurile (cuvintele) de 16 caractere consecutive din mesaj. Apoi,
pentru fiecare cuvnt din dicionar vom determina, prin metoda cutrii binare, prima
i ultima apariie a cuvntului n irul sortat. Evident, dac un cuvnt din dicionar
conine k litere, atunci, n momentul n care determinm aceste dou poziii, vom lua
n considerare doar primele k litere ale irurilor.
O prim observaie ar fi c, datorit faptului c nu avem suficient memorie la
dispoziie, irul sortat trebuie s conin indici i nu cuvinte propriu-zise. Astfel, al i-
lea element al irului sortat va conine poziia la care ncepe al i-lea cuvnt n irul sor-
tat.
Datorit limitei de timp foarte stricte, algoritmii clasici de sortare (quicksort,
heapsort) nu sunt suficient de performani. Pentru aceast problem este recomandabi-
l folosirea algoritmului radixsort.
O alt dificultate care apare este datorat tot insuficienei memoriei. irul sortat de
indici ar trebui s conin numere reprezentate pe patru octei (teoretic ar fi suficieni
trei) deoarece textul poate conine peste 100000 de cuvinte. Pentru a evita aceast pro-
blem, vom mpri textul n patru blocuri i vom aplica algoritmul descris pentru fie-
care dintre ele. Fiecare bloc va conine cel mult 2
15
= 32768 litere. Datorit faptului c
numrul de litere este cel mult 2047 64 = 131008 < 2
17
= 131072, sunt suficiente pa-
tru blocuri. Vom avea i patru iruri sortate, dar fiecare element al acestor iruri va
putea fi reprezentat pe doi octei.
ONI 2002 61


Datorit mpririi textelor n blocuri apar probleme pentru cuvintele care fac parte
din dou blocuri. Pentru a le evita, vom face n aa fel nct ultimele 15 litere dintr-un
bloc s fie adugate ca primele 15 litere ale blocului urmtor. Dimensiunea total a
textului va crete cu pn la 45 de caractere, dar va ajunge doar la cel mult 131053 <
2
17
, deci nu apar blocuri suplimentare. Se observ c la nceputul celui de-al doilea
bloc sunt copiate 15 litere din primul, deci ultimele 15 litere ale acestui al doilea grup
trebuie s fie mutate n al treilea. Alte 15 litere ajung s fie ultimele n al doilea bloc,
deci trebuie copiate n al treilea. Aadar, la nceputul celui de-al treilea bloc vor fi ul-
timele 30 de litere ale celui de-al doilea bloc. Folosind acelai raionament, ajungem la
concluzia c la nceputul celui de-al patrulea bloc vor fi ultimele 45 de litere ale celui
de-al treilea bloc.
Aadar, pentru rezolvarea problemei, mai nti vom mpri textul iniial n grupuri
de 32768 de litere. Apoi vom realiza copierea grupurilor de 15, 30 i 45 de litere dintr-
un bloc n altul i vom construi cele patru iruri sortate, folosind algoritmul radixsort.
n continuare, pentru fiecare cuvnt din dicionar, vom determina prima i ultima apa-
riie a sa n fiecare dintre irurile sortate (dac nu exist nici o apariie vom spune, prin
convenie, c poziia ultimei apariii este mai mic dect poziia primei apariii). Nu-
mrul de cuvinte dintre cele dou poziii va fi adugat la numrul de apariii n text ale
cuvntului din dicionar. Pe msur ce sunt determinate apariiile cuvintelor din dici-
onar, se vor scrie n fiierul de ieire numerele corespunztoare.

Analiza complexitii
Citirea textului care trebuie analizat se realizeaz linie cu linie, deci ordinul de com-
plexitate al operaiei este O(N). Deoarece dicionarul conine M cuvinte, ordinul de
complexitate al operaiei de citire a acestor cuvinte este O(M).
Construirea blocurilor se realizeaz pe parcursul citirii, ordinul de complexitate al
operaiei fiind O(N). Aceeai complexitate (O(N)) o are i operaia de transformare a
blocurilor, astfel nct ultimele 15 litere dintr-un grup s fie identice cu primele 15 din
urmtorul.
Algoritmul radixsort este liniar, deci ordinul de complexitate al operaiei de sortare
este O(N).
Pentru fiecare cuvnt din dicionar vom efectua cel mult opt cutri binare, ordinul
de complexitate al unei cutri fiind O(log N). Pentru cele 8 cutri vom avea ordinul
de complexitate 8 O(log N) = O(log N). Deoarece pentru fiecare dintre cele M cuvin-
te din dicionar se vor realiza cutri binare, ordinul de complexitate al operaiei de
determinare a numrului de apariii pentru toate cuvintele din dicionar este O(M)
O(log N) = O(M log N).
Generarea datelor de ieire implic scrierea a M numere, deci ordinul de complexi-
tate al operaiei este O(M).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei probleme
este O(N) + O(M) + O(N) + O(N) + O(N) + O(M log N) + O(M) = O(M log N + N).
62 Soluiile problemelor propuse la Olimpiadele de Informatic



1.4.16. Suma divizorilor
Numrul A poate fi scris ca produs de factori primi sub forma:
n
p
n
p p
d d d A = K
2 1
2 1
,
unde d
1
, ..., d
n
sunt divizorii primi ai lui A, iar p
1
, ..., p
n
sunt puterile la care apar ace-
tia n descompunerea lui A n factori primi.
Ca urmare, numrul A
B
poate fi scris sub forma:
B p
n
B p B p B
n
d d d A

= K
2 1
2 1
.
Aadar, divizorii numrului A
B
au forma

=
n
i
q
i
i
d
1
, unde q
i
variaz ntre 0 i p
i
B.
Suma acestor divizori poate fi scris sub forma:

=
= =
n i
B p q
n
i
q
i
i i
i
d
, , 1
, , 0 1
K
K
.
Aceast sum de produse poate fi scris sub forma unui produs de sume astfel:

=
n
i
B p
j
j
i
i
d
1 0
.
Aadar, suma divizorilor unui numr de forma A
B
este dat de un produs de sume.
Aceste sume au forma 1 + q + q
2
+ q
3
+ ... + q
m
, deci sunt sume ale unei progresii ge-
ometrice de raie q. Este cunoscut faptul c valoarea unei astfel de sume, pentru q > 1
este
1
1
1

+
q
q
m
, iar pentru q = 1 este m + 1.
Datorit faptului c se cere determinarea restului mpririi la 9901 a sumei divizo-
rilor, toate operaiile efectuate vor fi modulo 9901.
Vor trebui folosite relaiile:
(a + b) mod n = ((a mod n) + (b mod n)) mod n i
(a b) mod n = ((a mod n) (b mod n)) mod n.

De asemenea, datorit faptului c numrul 9901 este prim, pentru orice numr
nenul a va exista un numr a
-1
(numit invers) astfel nct (a a
-1
mod 9901 = 1). Aa-
dar, pentru a efectua o mprire cu un anumit numr vom realiza, de fapt, o nmulire
cu inversul acestuia.
Pentru a rezolva problema vom ncepe cu descompunerea numrului A n factori
primi i identificarea puterilor la care apar acetia n descompunere. Vom nmuli
aceste puteri cu B i apoi vom calcula sumele progresiilor corespunztoare.
Pentru calculul sumei unei progresii avem nevoie de efectuarea unei ridicri la pu-
tere (evident, modulo 9901). O modalitate rapid de calcul se bazeaz pe urmtoarea
formul recursiv:
ONI 2002 63



=
impar 0 pentru
par 0 pentru
0 pentru 1
] 2 / [ ] 2 / [
] 2 / [ ] 2 / [
n a a a
n a a
n
n n
n n


O modalitate de determinare a inversului unui numr a (modulo 9901) este conside-
rarea numerelor de forma 9901 k + 1 i alegerea primului numr b de aceast form
al crui rest la mprirea cu a este 1. Inversul va fi dat de valoarea b / a. Datorit fap-
tului c 9901 este prim va exista ntotdeauna un astfel de numr i se poate demonstra
c valoarea k corespunztoare este mai mic dect 9901.
O alt observaie necesar este faptul c scderea valorii 1 (necesar pentru calcu-
larea sumei progresiilor) este echivalent cu adunarea valorii 9900 (modulo 9901).
Pe parcursul determinrii sumei progresiilor, acestea vor fi nmulite, modulo 9901.
n final, rezultatul va fi scris n fiierul de ieire.

Analiza complexitii
Datele de intrare constau doar n dou numere, deci operaia de citire a acestora se rea-
lizeaz n timp constant.
Pentru determinarea divizorilor primi i a puterilor la care apar acetia n descom-
punerea numrului A vom lua n considerare numrul 2 i numerele impare cuprinse
ntre 3 i cel mult A , aadar ordinul de complexitate al acestei operaii este O( A ).
Numrul sumelor calculate este dat de numrul divizorilor primi ai numrului A.
Folosind aproximarea lui Stirling, se poate deduce c exist aproximativ ln A numere
prime cuprinse ntre 2 i A. Aadar, vom calcula O(log A) sume. Calculul unei sume
implic o ridicare la putere. Folosind algoritmul recursiv prezentat anterior, o ridicare
la puterea n are ordinul de complexitate O(log n). Puterea la care poate aprea un fac-
tor prim n descompunerea numrului A este cel mult log
2
A; n descompunerea lui A
B

puterea poate fi cel mult B log
2
A. Ca urmare, o ridicare la putere va avea ordinul de
complexitate O(log (B log A)). Celelalte operaii necesare pentru calculul sumelor se
realizeaz n timp constant (considerm c determinarea inversului are ordinul de
complexitate O(1) deoarece operaia necesit cel mult 9901 pai; exist i posibilitatea
construirii i utilizrii unui tablou de constante a, unde a
i
s conin inversul numru-
lui i modulo 9901), deci ordinul de complexitate al determinrii sumei tuturor divizo-
rilor este O(log A) O(log (B log A)) = O(log A log (B log A)).
n fiierul de ieire trebuie scris un singur numr, deci ordinul de complexitate al
operaiei de scriere a datelor de ieire este O(1).
n concluzie, ordinul de complexitate al algoritmului de rezolvare a acestei proble-
me este O(1) + O( A ) + O(log A log (B log A)) + O(1) = O( A + log A log(B
log A)).
64 Soluiile problemelor propuse la Olimpiadele de Informatic



1.4.17. Sistem
Problema poate fi enunat n termeni ai teoriei grafurilor astfel: S se determine nu-
mrul grafurilor neorientate distincte n care fiecare nod are gradul 2.
Este uor de determinat numrul grafurilor conexe cu proprietatea cerut; practic,
orice permutare (p
1
, p
2
, ..., p
N
) a mulimii poate duce la obinerea unei soluii. Dac
unim printr-o muchie vrfurile p
i
i p
i+1
(i = 1, , N 1) i vrfurile p
1
i p
N
,, obinem
un graf (hamiltonian) n care toate vrfurile au gradul 2. Lund n considerare toate
cele N! permutri obinem N! grafuri care respect proprietatea cerut. Totui, nu toate
aceste grafuri sunt distincte; dac alegem o anumit permutare, atunci toate celelalte
permutri circulare ale acesteia duc la obinerea aceluiai graf. De exemplu, permutri-
le (1, 2, ..., N) i (N, 1, ..., N 1) corespund aceluiai graf. Exist N permutri circulare
ale unei permutri date, deci numrul total al grafurilor distincte se reduce de N ori,
devenind (N 1)!. n plus, dac parcurgem n ordine invers o anumit permutare,
obinem acelai graf, deoarece grafurile sunt neorientate. De exemplu, permutrile (1,
2, ..., N) i (1, N, ..., 2) duc la obinerea aceluiai graf. Fiecare permutare poate fi par-
curs n sens invers ntr-un singur mod, deci numrul total al grafurilor distincte se
reduce de 2 ori. n concluzie, numrul grafurilor conexe cu proprietatea cerut este (N
1)! / 2. Aceast valoare este valabil pentru grafuri care conin cel puin trei noduri;
nu exist grafuri cu proprietatea cerut care s conin unul sau dou noduri.
Urmeaz s determinm numrul total al grafurilor (conexe i neconexe) care au
proprietatea cerut. Vom nota cu Nr
k
numrul grafurilor care respect proprietatea ce-
rut i conin k noduri. Vom avea Nr
1
= Nr
2
= 0 deoarece nu exist nici un astfel de
graf care s conin unul sau dou noduri. Prin convenie vom considera Nr
0
= 1 (se
poate considera c graful vid respect proprietatea cerut, deoarece am putea spune c
"toate cele 0 noduri au gradul 2", dei aceast afirmaie este, practic, lipsit de sens;
totui aceast convenie se va dovedi util pentru simplificarea calculelor).
Vom considera, pe rnd, c nodul 1 face parte din componente conexe cu 3, 4, ..., N
noduri. Vom determina numrul de grafuri n care acest nod face parte din componen-
te conexe cu k elemente (k este cuprins ntre 3 i N) i apoi vom aduna aceste valori.
Dac nodul 1 face parte dintr-o component conex cu k elemente, atunci exist
1
1

k
N
C
posibiliti de a alege celelalte k 1 noduri care fac parte din aceeai componen-
t conex. Folosind rezultatul demonstrat anterior, deducem c numrul componente-
lor conexe cu k elemente care respect proprietatea cerut este (k 1)! / 2. Indiferent
care sunt cele k noduri care formeaz componenta conex, celelalte N k noduri pot
forma Nr
N-k
grafuri cu proprietatea cerut. n concluzie, dac nodul 1 face parte dintr-o
component conex cu k elemente, avem
( )
2
! 1
1
1


k
C Nr
k
N k N
grafuri distincte cu
proprietatea cerut.
Se observ utilitatea conveniei Nr
0
= 1 deoarece, pentru componenta conex for-
mat din toate cele N noduri ale grafului, obinem:
ONI 2002 65


( ) ( ) ( )
2
! 1
2
! 1
1 1
2
! 1
1
1


N N N
C Nr
N
N N N
,adic exact numrul grafurilor conexe
cu proprietatea cerut. Cazul k = N ar fi putut fi tratat ca fiind unul particular, dar folo-
sirea conveniei duce la simplificarea formulelor de calcul.
Numrul total al grafurilor este obinut prin nsumarea acestor valori pentru k = 3,
, N, deci vom avea

=
N
k
k
N k N N
k
C Nr Nr
3
1
1
2
)! 1 (
grafuri cu proprietatea cerut.
Chiar i pentru valori mici ale lui N, acest numr nu va putea fi reprezentat folosind
tipuri standard de date, deci vor trebui simulate operaii aritmetice cu numere mari.
Folosind un artificiu de calcul, nu va trebui s implementm dect adunarea a dou
numere mari i nmulirea dintre un numr mare i un numr mai mic dect N.
Vom avea nevoie de adunarea numerelor mari pentru calcularea sumei care duce la
obinerea valorilor Nr
k
. Valorile nsumate sunt obinute prin nmulirea unui numr
mare (Nr
N-k
cu mai multe numere mai mici dect 100). Aceste numere sunt obinute
folosind urmtorul artificiu:
.
2
) 1 ( ) 2 ( ) 1 (
)! ( 2
)! 1 (
2
)! 1 (
)! ( )! 1 (
)! 1 (
2
)! 1 (
1
1
+ +
=
=

N k N k N
k N
N k
k N k
N k
C
k
N
K

Aadar, irul numerelor cu care se vor realiza nmuliri este N k + 1, N k + 2, N
- 1. Deoarece k este cel puin 3, acest ir are cel puin dou elemente; elementele iru-
lui sunt numere consecutive, deci unul dintre primele dou este par. Acest numr par
va fi mprit cu 2 i se va obine un ir de elemente care vor fi nmulite, pe rnd, cu
un numr mare.
Pentru determinarea valorii Nr
N
este necesar calcularea tuturor valorilor Nr
k
(k <
N): acestea vor fi pstrate ntr-un ir de numere mari, iar n final valoarea Nr
N
va fi
scris n fiierul de ieire.

Analiza complexitii
Fiecare operaie aritmetic se efectueaz n timp constant, deoarece numrul cifrelor
unui numr (dac se folosete baza 10000) este mai mic dect 100.
Citirea datelor de intrare este realizat n timp constant pentru c se citete un sin-
gur numr.
Pentru calcularea unei valori Nr
K
avem nevoie de nsumarea a k 3 termeni. Valo-
rile Nr
i
necesare sunt cunoscute de la paii anteriori; pentru determinarea termenilor
care trebuie nsumai avem nevoie de i 1 nmuliri. Aadar, n total vom avea (k 4)
+ (k 5) + ... + 1 = (k 4)(k 3)/2 nmuliri. n concluzie, ordinul de complexitate al
operaiei de determinare a numrului Nr
k
este O(k
2
). Vom determina N astfel de nume-
re, ordinul de complexitate al ntregii operaii fiind O(N
3
), deoarece avem k = O(N).
66 Soluiile problemelor propuse la Olimpiadele de Informatic



Datele de ieire constau ntr-un singur numr mare, deci operaia de scriere a aces-
tora se realizeaz n timp constant.
n concluzie, algoritmul de rezolvare a acestei probleme are ordinul de complexita-
te O(1) + O(N
3
) + O(1) = O(N
3
).
1.4.18. Comitat
O posibilitate de rezolvare a acestei probleme este folosirea metodei programrii di-
namice. Vom ncerca s determinm un tablou tridimensional A, unde A
ijk
va indica
lungimea minim a unui traseu care pornete din Mordor (turnul 0), ultimele dou tur-
nuri de pe acest traseu sunt j i k i traseul conine n total i turnuri.
Se observ c lungimile traseelor care conin i turnuri pot fi determinate cu ajutorul
lungimilor traseelor care conine i 1 turnuri. Astfel, vom lua n considerare toate tra-
seele pe care se afl i 1 turnuri, i ultimul turn al traseului este j i l vom alege pe
cel mai scurt dintre acestea. La lungimile acestor trasee vom aduga distana dintre
turnurile j i k. Datorit faptului c un clre se poate deplasa doar paralel cu axele de
coordonate, distana dintre dou turnuri i i j va fi dat de |x
i
x
j
| + |y
i
y
j
|. Fie p, pe-
nultimul turn de pe traseul care se termin n turnul j; evident, unghiul determinat de
turnurile p, i i j nu trebuie s anuleze convexitatea traseului. Pentru a putea reconstitui
traseul vom pstra, pentru fiecare triplet (i, j, k) numrul de ordine p al turnului care se
afl pe traseu naintea turnurilor j i k.
n final, vom obine toate elementele tabloului tridimensional A. Evident, traseul
trebuie s fie un poligon nchis, deci ultimul turn trebuie s fie 0 (Mordor). Aadar,
vom studia valorile A
ij0
; vom determina cea mai mare valoare i pentru care exist o
valoare j, astfel nct valoarea A
ij0
este cel mult egal cu lungimea maxim a traseului.
Dup identificarea valorilor i i j, vom putea determina turnurile de pe traseu cu
ajutorul predecesorilor pstrai pentru fiecare triplet (i, j, k).
Pentru a mri viteza de execuie a programului vom determina, pentru fiecare tri-
plet (i, j, k), dac cele trei turnuri corespunztoare se pot afla pe poziii consecutive n
traseu (se respect condiia de convexitate) i vom folosi aceste informaii pe parcurs
n loc s verificm convexitatea de fiecare dat.
Iniial putem determina toate traseele pe care se afl dou turnuri (Mordor i orica-
re dintre celelalte). n continuare vom aplica algoritmul pentru a determina lungimile
traseului pe care se afl 3 turnuri, 4 turnuri etc.

Analiza complexitii
Datele de intrare constau n numrul turnurilor, coordonatele acestora i lungimea ma-
xim a traseului, deci ordinul de complexitate al operaiei de citire este O(n).
Va trebui s verificm pentru fiecare triplet (i, j, k) dac se respect condiia de
convexitate, operaie care are ordinul de complexitate O(n
3
), deoarece exist (n + 1)
3

astfel de triplete (i, j i k variaz ntre 0 i n).
ONI 2002 67


Pentru a determina o valoare A
ijk
, vor trebui luai n considerare toi predecesorii
posibili, deci ordinul de complexitate al acestei operaii este O(n). Deoarece tabloul
este tridimensional sunt realizate O(n
3
) astfel de operaii, deci ordinul de complexitate
al operaiei de determinare a tabloului A (i a tabloului care conine predecesorii) este
O(n) O(n
3
) = O(n
4
).
Identificarea valorii A
ij0
care indic lungimea traseului care conine cele mai multe
turnuri se realizeaz n timp ptratic deoarece, n cel mai defavorabil caz, sunt luate n
considerare toate perechile (i, j).
Refacerea traseului (i scrierea turnurilor de pe traseu n fiierul de ieire) pe baza
tabloului predecesorilor se realizeaz n timp liniar, deoarece vor exista cel mult n tur-
nuri pe acest traseu.
n concluzie, algoritmul de rezolvare a acestei probleme are ordinul de complexita-
te O(n) + O(n
3
) + O(n
4
) + O(n
2
) + O(n) = O(n
4
).

S-ar putea să vă placă și