Sunteți pe pagina 1din 71

UNIVERSITATEA DE VEST DIN TIMIŞOARA

FACULTATEA DE MATEMATICĂ ŞI INFORMATICĂ

CULEGERE DE PROBLEME
PENTRU ADMITERE

Informatică

TIMIŞOARA
2021
Cuprins

1 Subiecte propuse ı̂n cadrul sesiunilor de pregătire pentru bacalaure-


at/admitere la facultate 3
1.1 Algoritmi de prelucrare a datelor simple . . . . . . . . . . . . . . . . . 3
1.2 Descompunerea unei probleme ı̂n subprobleme . . . . . . . . . . . . . . 5
1.3 Algoritmi de prelucrare a tablourilor unidimensionale . . . . . . . . . . 7
1.4 Algoritmi de prelucrare a tablourilor bidimensionale . . . . . . . . . . . 12
1.5 Algoritmi recursivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.6 Algoritmi de sortare. Algoritmi de căutare . . . . . . . . . . . . . . . . 16
1.7 Prelucrări asupra şirurilor de caractere . . . . . . . . . . . . . . . . . . 19
1.8 Structuri de date pentru grafuri . . . . . . . . . . . . . . . . . . . . . . 27

2 Subiecte date la Concursul FMI 30


2.1 Edit, ia a III-a (2017) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.2 Edit, ia a IV-a (2018) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.3 Edit, ia a V-a (2019) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.4 Edit, ia a VI-a (2021) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

3 Subiecte date la examenul de admitere la facultate 54


3.1 Sesiunea Iulie 2016 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.2 Sesiunea Iulie 2017 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.3 Sesiunea Iulie 2018 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.4 Sesiunea Iulie 2019 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

2
Capitolul 1

Subiecte propuse ı̂n cadrul


sesiunilor de pregătire pentru
bacalaureat/admitere la facultate

1.1 Algoritmi de prelucrare a datelor simple

Tematică
ˆ Prelucrări asupra cifrelor (extragerea şi analiza cifrelor unui număr natural)

ˆ Proprietăţi de divizibilitate (verificare divizibilitate, determinarea celui mai mare


divizor comun, verificare şi generare numere prime, descompunere ı̂n factori
primi)

ˆ Calcule de sume şi produse

ˆ Generarea de şiruri date prin relaţii de recurenţă

Probleme
1. Fie n un număr natural nenul. Descrieţi algoritmi pentru:

(a) Determinarea sumei tuturor cifrelor lui n. De exemplu, pentru n = 26326


se obţine valoarea 19.
(b) Determinarea valorii obţinute prin inversarea cifrelor numărului n. De exem-
plu, pentru valoarea 26326 se obţine valoarea 62362.
(c) Determinarea tuturor cifrelor binare ale lui n.
(d) Determinarea tuturor divizorilor proprii ai lui n.
(e) Afis, area mesajului da” dacă cea mai semnificativă cifră a unui număr n

este strict mai mare decât cifra unităţilor sau mesajul nu” ı̂n caz contrar.

De exemplu, pentru n = 5832 se va afişa da” pentru că 5 > 2, iar pentru

n = 4539 se va afişa nu”.

3
2. Cifra destinului. Cifra destinului este cifra obţinută prin adunarea cifrelor ce
intervin ı̂n data naşterii; adunarea cifrelor rezultatului obţinut se repetă până se
ajunge la o singură cifră. De exemplu, pentru 01.02.1999 se obţine: 1 + 2 + 1 +
9 + 9 + 9 = 31 → 3 + 1 = 4. Descrieţi un algoritm care calculează cifra destinului
pornind de la data nas, terii specificată prin cele trei valori (zi, lună, an).

3. Numere asemenea. Două numere naturale sunt asemenea dacă scrierile celor
două numere ı̂n baza 10 au aceleas, i cifre. De exemplu, numerele 23326 s, i 623
sunt asemenea, deoarece mult, imea cifrelor este aceeas, i ({2, 3, 6}). Descrieţi un
algoritm care preia o pereche de numere naturale s, i determină dacă sunt sau nu
asemenea.

4. Conversie ı̂ntre baze de numeraţie. Se consideră că numărul natural nenul n


este reprezentat ı̂n baza de numeraţie b1 (2 ≤ b1 ≤ 10) şi se doreşte construirea
numărului natural m care reprezintă aceeaşi valoare, ı̂nsă ı̂n baza b2 (2 ≤ b2 ≤
10). Atât numărul iniţial cât şi cel convertit sunt specificate prin variabile ı̂ntregi
(nu este posibilă utilizarea unui tablou pentru stocarea cifrelor). De exemplu,
pentru n = 2210 şi b1 = 3, b2 = 5 se obţine m = 300.

5. Reguli de codificare. Se consideră un număr natural n constituit din k ≥ 2 cifre


(n = ck ck−1 . . . c1 ) şi se pune problema codificării lui n prin schimbarea poziţiei
unor cifre fără a stoca cifrele lui n ı̂ntr-un tablou. Descrieţi algoritmi pentru
următoarele două variante de codificare:

(a) Permutare circulară a cifrelor. Fiind dată o valoare p (1 ≤ p ≤ k − 1), să se


construiască numărul m = cp cp−1 . . . c1 ck ck−1 . . . cp+1 . De exemplu, pentru
n = 45612 şi p = 2 se obţine m = 12456.
(b) Interschimbare a două cifre. Fiind date două valori p1 şi p2 (1 ≤ p2 ≤ p1 ≤
k − 1) să se construiască numărul obţinut prin interschimbarea cifrelor de
pe poziţiile indicate de p1 şi p2 (din n = ck ck−1 . . . cp1 . . . cp2 . . . c1 se obţine
m = ck ck−1 . . . cp2 . . . cp1 . . . c1 ), toate celelalte cifre rămânând pe poziţia
lor iniţială. De exemplu, pentru n = 45612, p1 = 4, p2 = 2 se obţine
m = 41652.

6. Pentru un număr natural n, să se scrie un algoritm care determină numărul


maxim de divizori pe care ı̂i are un număr din mulţimea {2, 3, . . . , n}. De exem-
plu, dacă n = 12, numărul maxim de divizori este 5 (numărul 12 are 5 divizori:
2, 3, 4, 6, 12).

7. Descrieţi un algoritm care, pentru două numere naturale nenule a şi b, determină
numitorul şi numărătorul fracţiei ireductibile egale cu ab .

8. Să se descrie un algoritm care verifică dacă un număr n este prim sau nu, folosind
teorema lui Wilson. (Condit, ia necesară s, i suficientă ca un număr natural p, p > 1,
să fie prim este ca (p − 1)! + 1 să fie divizibil cu p.)

9. Să se descrie un algoritm care afişează toate numerele prime dintr-un interval
dat [a, b], a, b numere naturale, a < b.

4
10. Se consideră un număr natural n > 2. Descrieţi un algoritm care să afis, eze toate
numerele x mai mici decât n, care au proprietatea că x − 1 s, i x + 1 sunt numere
prime. Exemplu: pentru n = 43, se vor afis, a numerele: 4 6 12 18 30 42.

11. Scriet, i un algoritm care afişează descompunerea unui număr natural n ı̂n factori
primi. De exemplu, pentru n = 18, se va afişa 2ˆ1 × 3ˆ2.

12. Să se scrie un algoritm care, pentru numărul natural n dat, determină sumele:

(a) S = 1 × 2 + 2 × 3 + 3 × 4... + n × (n + 1)
(b) S = 1 × n + 2 × (n − 1) + 3 × (n − 2) + ... + n × 1

13. Estimaţi cu precizia ε > 0 limitele s, irurilor următoare (pentru punctele (a) şi (b)
se consideră că x este o valoare dată din intervalul (0, 1)):
i x2i+1
(a) sn = ni=0 (−1)
P
(2i+1)!
i x2i
(b) sn = ni=0 (−1)
P
(2i)!

(c) sn = ni=1 (2i+1)1


P
2

Indicaţie. Calculul se opreşte atunci când diferenţa dintre doi termeni consecutivi
ai s, irului este mai mică decât constanta ε(|sn − sn−1 | < ε, ε = 0.001).

14. Să se scrie un algoritm care determină dacă un număr natural dat m face parte
din s, irul lui Fibonacci sau nu. S, irul lui Fibonacci este definit prin relat, iile:
f (0) = 1, f (1) = 1, f (n) = f (n − 1) + f (n − 2), pentru n ≥ 2. Nu se vor folosi
tablouri.

1.2 Descompunerea unei probleme ı̂n subprobleme

Tematică
Algoritmi de prelucrare a datelor simple şi exemple de utilizare a subprogramelor
(funcţii şi proceduri) s, i a diferitelor tipuri de parametri (parametri de intrare, ies, ire,
intrare/ies, ire) s, i variabile (locale, globale). Tipuri de prelucrări:

ˆ Prelucrări asupra cifrelor (extragerea şi analiza cifrelor unui număr natural)

ˆ Prelucrări ale unor secvenţe de valori preluate secvenţial (fără să fie stocate ı̂n
structuri de tip tablou)

ˆ Prelucrări asupra unor mult, imi de puncte ı̂n plan, date prin coordonatele lor
carteziene

ˆ Evaluarea unui polinom specificat prin valorile coeficient, ilor

ˆ Prelucrări cu numere complexe

5
Probleme
1. Se asociază unui număr natural n valoarea A(n) ca fiind suma factorialelor ci-
frelor lui n (de exemplu, pentru n = 318, A(n) = 3! + 1! + 8!).

(a) Pentru o valoare n dată să se calculeze A(n). Calculaţi numărul de operaţii
de ı̂nmulţire efectuate. Propuneţi o variantă care să utilizeze un număr cât
mai mic de operaţii de ı̂nmulţire.
(b) Pentru o valoare naturală k (k < 9999) să se determine cel mai mic număr
natural n cu proprietatea că A(n) = k.

2. Determinaţi cel mai mic şi cel mai mare număr constituit din k cifre (k < 5)
având proprietatea că suma cifrelor este S. Date de test: k = 3, S = 25; k =
4, S = 33; k = 4, S = 12.

3. Se pune problema generării unei valori naturale n pornind de la 0 şi folosind


doar următoarele două operaţii: (i) dublarea valorii curente; (ii) incrementarea
valorii curente. De exemplu, 5 = (0 + 1) × 2 × 2 + 1 se poate obţine aplicând
secvenţa de operaţii: incrementare; dublare; dublare; incrementare, iar 12 =
(((0+1)×2+1)×2)×2 se obţine aplicând: incrementare, dublare, incrementare,
dublare, dublare.

(a) Pentru o valoare naturală n determinaţi o secvenţă de operaţii care permite


generarea valorii.
(b) Determinaţi numărul minim de operaţii de incrementare şi dublare care
permit generarea valorii n.

4. Se citeşte o secvenţă de n perechi de valori reale (x1 , y1 ), (x2 , y2 ), . . . , (xn , yn )


care reprezintă coordonatele vârfurilor unui poligon convex P1 P2 . . . Pn (punctul
Pi are coordonatele (xi , yi )) specificate ı̂n ordine trigonometrică. Să se determine:

(a) Perimetrul poligonului.


(b) Aria poligonului.
(c) Coordonatele vârfurilor celui mai mic dreptunghi, având laturile paralele
cu axele de coordonate, care conţine poligonul.
(d) Numărul efectiv de laturi ale poligonului (se presupune că pot exista mai
mult de două puncte consecutive coliniare).

Date de test: P1 (2, 5)P2 (1, 4)P3 (1, 2)P4 (2, 1)P5 (5, 1)P6 (8, 1)P7 (9, 3)P8 (8, 5)P9 (5, 5)

5. Se consideră polinomul de grad n cu coeficienţi reali: P (z) = cn z n + cn−1 z n−1 +


· · · + c1 z + c0 şi se pune problema calculului valorii polinomului pentru un număr
complex z = a + bi, specificat prin partea sa reală a şi coeficientul părţii sale
imaginare b. Valorile coeficienţilor se citesc succesiv ı̂ncepând cu cn .
Date de test: z = 2 + 3i, P (z) = 2z 3 − 3z 2 + z − 6.

6. Se citeşte succesiv o secvenţă de n valori reale care conţine cel puţin o va-
loare pozitivă. Să se determine indicele de ı̂nceput şi indicele de sfârşit ale unei
subsecvenţe de elemente consecutive care satisface:

6
(a) Este cea mai lungă subsecvenţă crescătoare din secvenţa dată.
(b) Suma elementelor subsecvenţei este maximă (ı̂n raport cu sumele altor
subsecvenţe din secvenţă).

Date de test: − 1, 2, 1, −1, 3, 4, 5, −3, 1, 4


2, −3, 1, 3, 4, −2, 1, 2, 3, −5

7. Se consideră un serviciu web la care utilizatorii se conectează/deconectează şi


se pune problema determinării numărului maxim de utilizatori conectaţi si-
multan pornind de la o secvenţă de semnale de forma: 1 (s-a conectat un
utilizator), 0 (s-a deconectat un utilizator). De exemplu, pentru secvenţa
1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0 numărul maxim de utilizatori conectaţi este 5.

8. O secvenţă de n valori reale preluate succesiv (fără a fi stocate ı̂ntr-un ta-


blou): x0 , x1 , . . . , xn−1 trebuie “netezită” prin mediere folosind o “fereastră”
de dimensiune 3, adică, pornind de la valorile din secvenţă, se afişează valorile
y1 , y2 , . . . , yn−2 care au proprietatea că yi = (xi−1 + xi + xi+1 )/3.

9. Se consideră relaţia de recurenţă care defineşte o secvenţă de tip Collatz:


(
n/2 dacă n este par
C(n) =
3n+1 dacă n este impar

Conjectura Collatz afirmă faptul că pentru orice valoare de pornire n, secvenţa
va ajunge la 1. Pentru un număr natural n se defineşte L(n) ca fiind lungimea
secvenţei, adică numărul de elemente din secvenţă până la ı̂ntâlnirea valorii 1
(inclusiv valoarea 1). Două numere, n1 şi n2 , se consideră Collatz-echivalente
dacă L(n1 ) = L(n2 ). Pentru două valori naturale, a şi b (a < b), să se determine
toate perechile de numere Collatz-echivalente din mult, imea {a, a + 1, . . . , b}.

10. Se consideră o funcţie integrabilă f : [a, b] → R şi se pune problema aproximării


integralei funcţiei f pe intervalul [a, b] folosind o sumă Riemann “la stânga” cu
pasul h(n) = (b−a)/n : S(n) = h(n)(f (a)+f (a+h(n))+· · ·+f (b−h(n))). Fiind
date limitele intervalului, să se calculeze S(n∗ ) (n∗ este prima valoare pentru care
|S(n∗ ) − S(n∗ − 1)| < 0.001).

1.3 Algoritmi de prelucrare a tablourilor unidimen-


sionale

Tematică
ˆ Declararea s, i parcurgerea tablourilor unidimensionale

ˆ S, tergeri s, i inserări de elemente

ˆ Verificarea unor proprietăt, i

7
ˆ Sortarea tablourilor
ˆ Interclasarea tablourilor
ˆ Secvent, e de vectori

Probleme
1. Parcurgere şi construire tablouri. Se consideră două tablouri, A s, i B, având
fiecare n elemente numere ı̂ntregi. Să se scrie câte o funcţie/procedură cores-
punzătoare următoarelor probleme:
(a) Considerăm că A şi B au aceeaşi lungime: se cere să se construiască un
tablou C care conţine elementele comune, care apar atât ı̂n A cât şi ı̂n B
pe aceeaşi poziţie, dacă nu există acelaşi element se va pune 0 ı̂n tabloul C.
(b) Calculează suma elementelor din A care apar şi ı̂n B pe aceeaşi poziţie.
(c) Construieşte un tablou D care conţine pe poziţia i suma elementelor cores-
pondente din A şi B. Dacă au dimensiuni diferite, D va conţine o copie a
elementului din tabloul mai lung.
2. Conversii ı̂ntre baze de numeraţie (utilizând tablouri).
(a) Se consideră că numărul natural nenul n este reprezentat ı̂n baza 10 şi se
doreşte construirea tabloului de caractere care sa conţină cifrele numărului.
(b) (generalizare a) Se consideră că numărul natural nenul n este reprezentat
ı̂n baza 10 şi se doreşte construirea numărului m care reprezintă aceeaşi
valoare, ı̂nsă ı̂n baza b (2 ≤ b ≤ 9). Numărul m va fi reprezentat printr-un
s, ir de caractere.
(c) Se consideră un tablou (B) de ı̂ntregi care conţine doar 0 sau 1. Tabloul
cont, ine reprezentarea ı̂n baza 2 a unui număr natural şi se pune problema
construirii unui tablou (H) care conţine reprezentarea ı̂n baza 16. De exem-
plu, pentru B = 10110011 se obţine H = B3.
(d) Se consideră un şir de caractere care conţine reprezentarea ı̂n baza 16 a unui
număr (alfabetul folosit este ‘0’, ‘1’,. . . , ‘A’,. . . ,‘F ’) şi se pune problema
determinării valorii corespunzătoare ı̂n baza 10. De exemplu, pentru B9F
se obţine 2975.
3. Reprezentarea ı̂n complement fat, ă de 2. Numerele ı̂ntregi negative sunt repre-
zentate intern prin regula complementului fat, ă de 2 care constă ı̂n aplicarea
următoarelor etape: i) se determină reprezentarea ı̂n binar a numărului fără
semn s, i se complementează tot, i bit, ii (un bit 0 se transformă ı̂n 1, iar un bit 1
se transformă ı̂n 0); ii) se adună 1 la numărul anterior (folosind regulile de adu-
nare ı̂n baza 2). Ceea ce se obt, ine este reprezentarea internă a numărului ı̂ntreg
negativ. Dacă se dă o reprezentare internă hexazecimală (0xA2B3C4D5), prin
examinarea bitului de semn (cel mai din stânga) se decide dacă numărul este
negativ sau nu. Dacă numărul este negativ, atunci se vor aplica aceleas, i reguli
pentru a determina valoarea numărului. Să se scrie o funct, ie care să compare
două numere ı̂ntregi pe 32 de bit, i pentru care se cunoas, te reprezentarea internă
ı̂n hexazecimal. Funct, ia va returna

8
(a) −1 dacă primul număr este mai mic decât al doilea;
(b) 0 dacă sunt egale;
(c) 1 dacă primul număr este mai mare decât al doilea.

4. Definit, i un tablou cu numele de numere reale (tip double) de dimensiune 100.


Definit, i un ciclu ce va popula elementele tabloului cu următoarea secvent, ă:

1/(2 ∗ 3 ∗ 4), 1/(4 ∗ 5 ∗ 6), 1/(6 ∗ 7 ∗ 8), . . . până la 1/(200 ∗ 201 ∗ 202)

Presupunând că numele tabloului este data, parcurget, i tabloul pentru a calcula
următoarea expresie:

data[0]−data[1]+data[2]−data[3] + · · · −data[99]

Înmult, it, i rezultatul obt, inut anterior cu 4.0 s, i adăugat, i 3.0 s, i afis, at, i rezultatul.
Recunoas, tet, i valoarea obt, inută?

5. Gigel, Ionel s, i Călin, trei student, i de la Informatică au pornit un StartUp de


succes ı̂npreună. Fiecare s, tie câteva limbaje sau tehnici de programare: Gigel
s, tie n limbaje, Ionel s, tie m, iar Călin k. Înainte de a porni startup-ul cu propriul
lor proiect, pentru a face bani, s-au hotărât să participe la orice proiect pe care
l-ar putea face de pe freelancer.com, ı̂n orice combinat, ie posibilă. Fiecare astfel
de proiect necesită o mult, ime de cunos, tint, e prezentate foarte clar ı̂n descrierea
sa. Să presupunem că se cunosc cerint, ele pentru 30 de proiecte, să se scrie un
program care să stabilească alocarea student, ilor la proiecte ı̂n as, a fel ı̂ncât să
nu se suprapună competent, ele (pentru fiecare proiect se stabiles, te dacă vor intra
singuri, câte doi sau tot, i trei ı̂mpreună).
Exemplu: Gigel s, tie {C, C#, OOP s, i Java}, Ionel {C, Python, C++, OOP} s, i
Călin {C++, OOP, Ruby}. Dacă se cunosc cerint, ele pentru
Proiect 1: {OOP, C, Ruby, Python} → este nevoie de tot, i 3 pentru acest
proiect.
Proiect 2: {C#, Java} → Gigel ı̂l poate face singur.

6. Planificare service auto. Într-un service auto există 5 elevatoare s, i 5 mecanici.


Într-o lună se repară ı̂n acel service, ı̂n medie, 200 de mas, ini. S, eful de service,
Gigel, este cel care planifică fiecare mas, ină s, tiind pentru fiecare intervent, ie când
intră ı̂n service s, i cât durează reparat, ia. Se cunosc datele din planificare, când
intră fiecare mas, ină s, i cât durează intervent, ia (vor fi generate aleator), s, i mai
s, tim că Gigel, atunci când planifică, se uită pe rând care elevator este liber s, i
ı̂l marchează ı̂n planificare. Dacă nu are niciunul disponibil, atunci, ı̂mpreună
cu clientul, alege o altă dată s, i oră disponibilă. Întrebarea la care vrem să
răspundem este care din cele 5 elevatoare va fi folosit cel mai mult ı̂n luna ce
urmează s, i care vor fi mas, inile reparate, ı̂n ordinea cronologică a reparat, iilor.
Exemplu: Presupunem că ı̂n loc de 20 zile a câte 8 ore pe zi ne gândim la 160 de
ore pe lună. Ca intrare vom primi 2 seturi de numere care specifică ora la care
ı̂ncepe s, i cât durează ı̂ntervenţia pentru o maşină (1, 1, 5, 10, 7) şi (4, 6, 4, 3, 4) :

9
Maşina Ora start Durata
1 1 4
2 1 6
3 5 4
4 10 3
5 7 4

vom planifica astfel:


1, 1 + 4 → 5, 4 + 5 → 10, 10 + 3
1, 1 + 6 → 7, 7 + 4

7. Spalătorie auto self-service. La colţul străzii există o spălătorie auto self-service


cu 5 locuri. Istoricul unei zile arată ı̂n felul următor:

ˆ timpii de intrare ı̂n spălătorie : [8 : 00, 8 : 05, 8 : 05, 8 : 08, 8 : 32, 8 : 37, 8 :
43, 8 : 45 . . . ]
ˆ numărul de fise folosite: [2, 3, 4, 2, 1, 2, 3, 4 . . . ]

Se cere să se genereze ı̂ntâi datele de intrare (istoricul unei zile la spălătorie):

(a) Se va genera ora s, i minutul pentru fiecare dintre timpii de intrare apoi se
vor ordona crescător după oră s, i minute.
(b) Se va genera aleator numărul de fise folosite, un număr ı̂ntre 1 s, i 5.
S, tiind că o fisă durează 2 minute la care se va adăuga 1 minut, timpul
pierdut pentru pregătire, se cere să se implementeze funct, ii/proceduri co-
respunzătoare următoarelor probleme:
(c) Ştiind că o fisă costă 2.5 lei să se calculeze profitul zilei.
(d) Să se determine pentru fiecare maşină care este ora la care iese din spălătorie.
(e) Să se determine pentru fiecare maşină dacă trebuie să aştepte sau nu ca să
intre ı̂ntr-o boxă.
(f) Să se determine care este cel mai lung timp de aşteptare.

8. Clasament WTA. În acest moment conform https://www.tenisdecamp.ro/


clasament-wta-simplu/ ı̂n clasamentul WTA la tenis feminin primele 10 ju-
cătoare au următoarele puncte:

1 Australia Ashleigh Barty 8017


2 Czech Republic Karolina Pliskova 5940
3 Romania Simona Halep 5561
4 Japan Naomi Osaka 5496
5 Ukraine Elina Svitolina 5075
6 Canada Bianca Vanessa Andreescu 4935
7 Switzerland Belinda Bencic 4675
8 Czech Republic Petra Kvitova 4436
9 USA Serena Williams 4215
10 Holland Kiki Bertens 4165

10
Presupunem că ı̂n fiecare lună va fi câte un concurs de GrandSlam s, i ştim că
pentru GrandSlam se pot câs, tiga următoarele puncte

W F SF QF R16 R32 R64 R128 Q Q3 Q2 Q1


Points 2000 1300 780 430 240 130 70 10 40 30 20 2

(W=winner, F=Finalist, . . . )
Fiecare dintre jucătoarele din top 10 ar putea să câs, tige oricare meci s, i oricare
turneu.
S-a terminat turneul, se cunosc rezultatele şi ce s-a ı̂ntâmplat anul trecut:

Anul trecut Turneul actual


1 Ashleigh Barty W F
2 Karolina Pliskova QF W
3 Simona Halep F SF
4 Naomi Osaka SF SF
5 Elina Svitolina QF QF
6 Bianca Vanessa Andreescu R16 SF
7 Belinda Bencic QF QF
8 Petra Kvitova SF QF
9 Serena Williams R32 QF
10 Kiki Bertens SF QF

Având ı̂n vedere că fiecare punct câştigat anterior trebuie apărat, se pune ı̂ntre-
barea dacă Simona Halep va fi sau nu numărul 1 după acest turneu?

9. Analiză zaruri. Bogdan are 2 zaruri cu câte 6 fet, e fiecare, unul albastru s, i unul
ros, u. Le aruncă pe o masă de 100 de ori s, i ı̂s, i notează valorile obt, inute pentru
fiecare zar ı̂n parte (ı̂n câte un tablou cu 100 de elemente pentru fiecare zar). Să
se decidă care dintre cele 2 zaruri este cel mai echilibrat zar? Cel albastru sau
cel roşu?
Notă: Se va folosi formula entropiei lui Shannon pentru a determina cantitatea
de informat, ie existentă ı̂n fiecare zar. Zarul cu entropia mai mare este consi-
derat mai echilibrat. Dacă (f1 , f2 , . . . , f6 ) reprezintă frecvenţele relative asoci-
ate valorilor obţinute la aruncarea unui zar, regula de calcul a entropiei este
−f1 × log2 (f1 ) − f2 × log2 (f2 ) − · · · − f6 × log2 (f6 ), entropie mai mare ı̂nseamnă
mai echilibrat.

10. Sufix şi prefix comun. Fiind date două tablouri (a1 , a2 , . . . , am ) şi (b1 , b2 , . . . , bn ),
cu numere ı̂ntregi, să se stabilească numărul maxim de elemente comune aflate
la sfârşitul lui a şi ı̂nceputul lui b (de exemplu, a = (1, 4, 3, 5, 6, 7, 2) şi b =
(6, 7, 2, 5, 1, 8) au 3 elemente comune, pe 6, 7 şi 2).

11. Date de naştere. Se consideră o listă care conţine datele de naştere ale locuitorilor
unui oraş (lista poate fi reprezentată printr-un tablou conţinând structuri sau
prin 3 tablouri corespunzătoare celor 3 componente ale date: (zi, lună, an)). Să
se determine:

11
(a) cea mai “mică” dată de naştere (corespunzătoare celui mai vârstnic locui-
tor);
(b) cea mai “mare” dată de naştere (corespunzătoare celui mai tânăr locuitor);
(c) cea/cele mai frecventă/frecvente dată/date de naştere (cea/cele care apa-
re/apar de cele mai multe ori ı̂n listă);
(d) dacă există vreo zi ı̂n perioada (1 ianuarie 1918 – 31 decembrie 2017) ı̂n
care nu e născut niciun locuitor.

1.4 Algoritmi de prelucrare a tablourilor bidimen-


sionale

Tematică
ˆ Construire, parcurgere şi transformare

ˆ Operaţii cu matrici (adunare, ı̂nmulţire)

ˆ Verificare proprietăţi (simetrie, matrici triunghiulare, matrici diagonale etc.)

ˆ Aplicat, ii

Probleme
1. Să se verifice dacă o valoare x se găseşte ı̂ntr-o matrice cu m linii s, i n coloane.
Indicat, ie: Se parcurge matricea pe linii, apoi pe coloane, iar la prima ı̂ntâlnire a
elementului căutat ne oprim.

2. Calculat, i suma s, i produsul a două matrici.


Indicat, ie: În cazul adunării, cele două matrici trebuie să aibă aceeas, i dimensiune.
În cazul produsului, numărul de coloane ale primei matrici trebuie să fie egal cu
numărul de linii ale celei de a doua. Matricea produs va avea numărul de linii al
primei matrici s, i numărul de coloane al celei de a doua.

3. Calculat, i suma elementelor de pe diagonala principală s, i produsul elementelor


de pe diagonala secundară.
Indicat, ie: Pentru rezolvarea problemei, trebuie să ne asigurăm că matricea este
pătratică. Elementele de pe diagonala principală au indicii (i, i), iar cei de pe
diagonala secundară (i, n − i + 1), unde n este dimensiunea matricii.

4. Să se determine transpusa unei matrici.


Indicat, ie: Transpusa unei matrici se obt, ine interschimbând liniile cu coloanele.

5. Să se elimine linia i şi coloana j dintr-o matrice cu m linii s, i n coloane.

6. Determinat, i dacă o matrice este simetrică (fat, ă de diagonala principală, respectiv


secundară), triunghiulară (superior, respectiv inferior), diagonală.

12
7. Să se verifice dacă o matrice pătratică de dimensiune n × n este pătrat magic
(suma elementelor de pe fiecare linie, coloană, diagonala principală şi diagonala
2 2
secundară este aceeaşi şi este egală cu n (n2 +1) şi memorează toate valorile de la
1 la n2 ).
 
6 1 8
Exemplu: 7 5 3 .
2 9 4
   
6 0 8 5 10 5
Contraexemple: 7 5 3 , 11 5 4  .
2 9 4 3 3 14
8. Se citesc de la tastatură dimensiunile unei matrici s, i elementele ei. Se cere
transformarea matricii prin inversarea ordinii elementelor ı̂n cadrul fiecărei linii.
   
1 2 3 4 5 5 4 3 2 1
Exemplu: Pentru matricea 3 4 1 2 1 se obt, ine 1 2 1 4 3 .
2 3 4 1 8 8 1 4 3 2
9. Pentru o matrice cu n linii s, i m coloane, care memorează numere ı̂ntregi, modificat, i
ordinea elementelor astfel ı̂ncât parcurgând matricea de sus ı̂n jos şi de la stânga
la dreapta aceasta să conţină mai ı̂ntâi elementele negative, apoi pe cele pozitive.
Se va analiza atât varianta ı̂n care se poate utiliza un tablou adit, ional (cu m × n
elemente), cât s, i varianta ı̂n care nu se utilizează tablou adit, ional.
   
−5 6 −8 3 −5 −9 −8 −8
Exemplu: Pentru matricea  2 −9 1 −6 se obt, ine −6 −2 1 2 .
8 1 −8 −2 8 1 3 6
10. Se consideră o reţea de n calculatoare şi o matrice pătratică de dimensiune n care
conţine elemente din {0, 1} completate astfel: a[i, j] = 1 dacă calculatorul i este
conectat direct cu calculatorul j şi a[i, j] = 0 ı̂n caz contrar. Scrieţi algoritmi
care verifică dacă:

(a) reţeaua este complet conectată (a[i, j] = 1 pentru fiecare pereche (i, j) de
valori diferite)
(b) reţeaua este de tip inel (a[i, i + 1] = a[i + 1, i] = 1 pentru fiecare i din
1, . . . , n − 1 şi a[n, 1] = a[1, n] = 1, iar celelalte elemente sunt nule)
(c) reţeaua este de tip stea (există un i∗ cu proprietatea că a[i, i∗ ] = a[i∗ , i] = 1,
pentru orice i 6= i∗ , iar celelalte elemente sunt nule).

Notă: Considerăm că un calculator nu este conectat cu el ı̂nsus, i, astfel că a[i, i] =
0, pentru fiecare i.

11. Se consideră o imagine color de dimensiune n×n pixeli. S, tiind că fiecărui pixel ı̂i
corespund trei valori din mult, imea {0, 1, . . . , 255} (câte una pentru fiecare dintre
cele trei canale de culoare - ros, u, verde s, i albastru) propunet, i o structură de date
pentru stocarea imaginii. Descriet, i un algoritm care:

(a) transformă imaginea color ı̂ntr-o imagine pe nivele de gri folosind pentru
fiecare pixel regula:

13
max (ros, u,verde,albastru)+min(ros, u,verde,albastru)
gri = 2

(b) construies, te histograma (tabelul cu frecvent, ele corespunzătoare valorilor


pixelilor) asociată imaginii pe nivele de gri
(c) determină valoarea medie folosind histograma construită la punctul (b)
(d) transformă imaginea pe nivele de gri ı̂n imagine alb-negru (alb are codul 1,
negru are codul 0) folosind valoarea determinată la punctul (c) ca valoare
de prag (dacă valoarea pixelului din imaginea pe nivele de gri este mai mică
decât valoarea medie atunci valoarea pixelului ı̂n imaginea alb-negru este
0, altfel este 1)
(e) verifică dacă imaginea alb-negru construită la punctul anterior cont, ine pixeli
negri pe diagonala principală s, i pe cea secundară s, i pixeli albi ı̂n rest.

Indicat, ie: Putem asimila o imagine cu 3 matrici, Mr – matricea pixelilor ros, ii,
Mv – matricea pixelilor verzi, Ma – matricea pixelilor albas, tri. Atunci structura
de date este tuplul format din cele 3 matrici. Pentru rezolvarea punctului (a) se
folosesc 2 funct, ii auxiliare de calcul al maximului/minimului dintre două numere,
iar ca operat, ie principală este adunarea de matrici. La punctul (b) se t, ine cont
de faptul că tabloul de frecvent, e are lungimea de 256. Punctele (b) s, i (c) sunt
aplicat, ii la adunarea a două matrici, conceptul de adunare a elementelor din
matrice. Punctele (d) s, i (e) testează proprietăt, i ale matricilor.

12. Se consideră o matrice pătratică cu n linii s, i n coloane. Descriet, i câte un algoritm


pentru:

(a) afis, area elementelor din matrice linie după linie


(b) afis, area elementelor din matrice coloană după coloană
(c) afis, area elementelor din matrice diagonală după diagonală (pornind de la
elementul de pe prima linie ultima coloană s, i parcurgând fiecare diagonală
paralelă cu diagonala principală pornind de sus ı̂n jos).
De exemplu, pentru o matrice cu 4 linii s, i 4 coloane s, i elemente a[i, j], aces-
tea vor fi afis, ate ı̂n următoarea ordine: a[1, 4], a[1, 3], a[2, 4], a[1, 2], a[2, 3],
a[3, 4], a[1, 1], a[2, 2], a[3, 3], a[4, 4], a[2, 1], a[3, 2], a[4, 3], a[3, 1], a[4, 2], a[4, 1].
(d) afis, area elementelor ı̂n spirală pornind de la elementul de pe prima linie s, i
prima coloană s, i parcurgând matricea ı̂n sensul acelor de ceasornic.
Pentru exemplul de mai sus, ordinea de afis, are va fi: a[1, 1], a[1, 2], a[1, 3],
a[1, 4], a[2, 4], a[3, 4], a[4, 4], a[4, 3], a[4, 2], a[4, 1], a[3, 1], a[2, 1], a[2, 2], a[2, 3],
a[3, 3], a[3, 2].

1.5 Algoritmi recursivi

Tematică
ˆ Descrierea algoritmilor recursivi

ˆ Tehnici recursive

14
ˆ Proceduri s, i funct, ii recursive

ˆ Analiza complexităt, ii algoritmilor recursivi

ˆ Exemple

Probleme
1. Să se determine cel mai mare divizor comun a două numere naturale (cmmdc)
folosind o implementare recursivă a algoritmului lui Euclid bazat pe scăderi
repetate.

2. Să se determine cel mai mare divizor comun a două numere naturale (cmmdc)
folosind o implementare recursivă a algoritmului lui Euclid bazat pe ı̂mpărt, iri
repetate.

3. În matematică, factorialul unui număr natural n (folosit adesea ı̂n algebră, com-
binatorică s, i analiza matematică), notat cu n!, este produsul tuturor numerelor
naturale mai mici sau egale cu n. Prin convent, ie, 0! este egal cu 1. Să se scrie o
funct, ie recursivă pentru calculul valorii factorialului unui număr ı̂ntreg dat.

4. Cu ajutorul unei funct, ii recursive, să se verifice dacă un număr natural este
factorialul unui alt număr natural.

5. S, irul lui Fibonacci este un s, ir de numere naturale ı̂n care, cu except, ia primilor doi
termeni egali cu 1, ceilalt, i termeni reprezintă suma celor doi anteriori. Acest s, ir
este unul dintre cele mai populare s, iruri specificate printr-o relat, ie de recurent, ă.

(a) Să se scrie o funct, ie recursivă care determină valoarea termenului din s, ir de
un rang specificat.
(b) Să se scrie o funct, ie recursivă care determină rangul primului termen care
atinge sau depăs, es, te o valoare dată.

6. Se consideră un număr natural n. Scriet, i câte o funct, ie recursivă pentru:

(a) Calculul sumei cifrelor numărului n


(b) Calculul produsului cifrelor nenule ale numărului n

7. Înt, elegem prin răsturnatul unui număr, numărul obt, inut atunci când cifrele se
parcurg ı̂n ordinea inversă celei naturale (cea mai din stânga cifră este cifra
unităt, ilor, următoarea spre dreapta este cifra zecilor s, .a.m.d.). Să se scrie o
funct, ie recursivă care generează răsturnatul unui număr natural primit ca para-
metru.

8. Scriet, i o funct, ie recursivă care verifică dacă numărul natural primit ca parametru
poate fi scris ca sumă de termeni din s, irul lui Fibonacci.

9. Să se scrie o funct, ie recursivă pentru descompunerea ı̂n factori primi a unui
număr natural.

10. Să se scrie o funct, ie recursivă pentru calculul valorii lui 2 la puterea n.

15
11. Scriet, i o funct, ie recursivă pentru calculul combinărilor de n luate câte k.

12. Să se calculeze, folosind funct, ii recursive, sumele:

S1 = 1 + 1/2 + 1/3 + · · · + 1/n


S2 = 1/2 + 2/1 + 2/3 + 3/2 + · · · + n/(n + 1) + (n + 1)/n

13. Scriet, i o funct, ie recursivă care primes, te ca parametru un număr natural n s, i


returnează numărul obt, inut din n prin eliminarea cifrelor pare.
De exemplu, pentru n = 134467, funct, ia returnează 137.

14. Se consideră un număr natural care cont, ine cel mult 9 cifre s, i se pune problema
determinării numărului de cifre distincte ale numărului. Rezolvat, i problema
folosind una sau mai multe funct, ii recursive.
De exemplu, pentru n = 41242, se obt, ine 3 (cifrele distincte sunt 4, 1, 2).

1.6 Algoritmi de sortare. Algoritmi de căutare

Tematică
ˆ Sortare prin insert, ie

ˆ Sortare prin select, ie

ˆ Metoda BubbleSort (sortarea prin interschimbare sau metoda bulelor)

ˆ Sortare prin numărare

ˆ Tehnica interclasării

ˆ Metoda QuickSort (sortarea rapidă folosind tehnica “Divide et impera”)

ˆ Căutare secvent, ială

ˆ Căutare binară

Probleme
1. Să se scrie un program care ordonează crescător elementele din prima jumătate a
unui vector s, i descrescător elementele din a doua jumătate. Numărul de elemente
ale vectorului este par.
Exemplu: Vectorul 8 2 9 4 5 7 după sortare devine 2 8 9 7 5 4.

2. Se consideră un set de obiecte caracterizate prin dimensiune şi culoare (sunt trei
culori posibile: roşu, alb, albastru). Să se ordoneze obiectele după culoare (prima
dată obiectele roşii, apoi cele albe şi la final cele albastre) astfel ı̂ncât obiectele
cu aceeaşi culoare să fie ordonate crescător după dimensiune.
Exemplu

16
Intrare: (4, alb), (3, ros, u), (6, ros, u), (5, albastru), (2, alb), (2, ros, u), (4,
albastru), (1, ros, u)
Ies, ire: (1, ros, u), (2, ros, u), (3, ros, u), (6, ros, u), (2, alb), (4, alb), (4,
albastru), (5, albastru)

Indicat, ie: Culoarea este reprezentată ca s, ir de caractere.

3. Se dau ı̂nălt, imile a n copii, numerotat, i de la 1 la n, exprimate prin numere


naturale. Afis, at, i numerele de ordine ale copiilor ı̂n ordinea crescătoare a ı̂nălt, imii
lor.
Exemplu

Intrare: 80, 160, 120, 110, 90, 70, 100


Ies, ire: 6, 1, 5, 7, 4, 3, 2

4. Adaptat, i algoritmul de sortare prin numărare pentru ordonarea descrescătoare


a unui tablou.

5. Scrieţi o funcţie/procedură care transformă un tablou unidimensional cu ele-


mente numere reale, primit ca parametru, astfel ı̂ncât elementele aflate pe poziţii
pare să fie ordonate descrescător, iar cele aflate pe poziţii impare să fie ordonate
crescător (poziţiile sunt contorizate ı̂ncepând cu 0, primul element este pe poziţie
pară, al doilea pe poziţie impară etc.). De exemplu, tabloul [5, 1, 7, 6, 2, 1, 8, 3]
se transformă ı̂n [8, 1, 7, 1, 5, 3, 2, 6].

6. Se dă un vector x cu n elemente numere naturale, ordonate crescător, s, i un


vector y cu m elemente, de asemenea numere naturale. Verificat, i pentru fiecare
element al vectorului y dacă apare ı̂n x.
Indicat, ie: Folosit, i căutarea binară s, i căutarea secvent, ială.

7. Se dau n numere naturale distincte. Determinaţi câte triunghiuri distincte pot


avea lungimile laturilor printre aceste numere.
Exemplu

Intrare: 5 (numărul de elemente) s, i 3 5 10 7 6 (elementele tabloului),


Ies, ire: 7

8. Se consideră două mult, imi A s, i B reprezentate prin tablouri având elementele


specificate ı̂n ordine strict crescătoare. Să se construiască tablourile ce cont, in
reuniunea s, i intersect, ia lui A s, i B.
Indicat, ie: Folosit, i tehnica interclasării.

9. Se dau două şiruri, cu n, respectiv m elemente, numere naturale. Primul şir este
ordonat crescător, iar al doilea este ordonat descrescător. Să se afişeze, ı̂n ordine
crescătoare, valorile pare din cele două şiruri.
Exemplu

17
Intrare: 5 (numărul de elemente ale s, irului 1), 2 4 7 37 42 (elementele
s, irului 1)
8 (numărul de elemente ale s, irului 2), 88 88 67 45 42 32 4 1 (elementele
s, irului 2)
Ies, ire: 2 4 4 32 42 42 88 88
Indicat, ie: Folosit, i tehnica interclasării.
10. Se dă un număr natural x s, i două tablouri a s, i b, cu n, respectiv m elemente,
numere naturale, ordonate strict crescător. Să se afis, eze, ı̂n ordine crescătoare,
multiplii lui x care se află doar ı̂n unul dintre cele două s, iruri.
Indicat, ie: Se parcurg cele două tablouri ı̂n paralel (ı̂n manieră balansată).
ˆ Dacă a[i] = b[j] atunci se ignoră s, i se progresează ı̂n ambele tablouri,
ˆ Altfel se verifică dacă valoarea mai mică (dintre a[i] s, i b[j]) este multiplu al
lui x (dacă este, se ret, ine valoarea) s, i se progresează ı̂n tabloul care cont, ine
valoarea mai mică.
11. La sect, ia de ı̂mpachetare a produselor dintr-o fabrică lucrează n muncitori. Fie-
care muncitor ı̂mpachetează acelas, i tip de produs s, i, pentru fiecare, se cunoas, te
timpul necesar pentru ı̂mpachetarea unui obiect. Să se determine durata minimă
de timp ı̂n care vor ı̂mpacheta cei n muncitori cel put, in M obiecte.
Exemplu
Intrare: 6 (număr muncitori), 60 (număr obiecte), 4 7 3 6 7 1 (durate)
Ies, ire: 30
Indicat, ie: Se simulează câte un “cronometru” pentru fiecare muncitor utilizând
un vector ale cărui elemente se incrementează până ajung la valoarea cores-
punzătoare timpului necesar ı̂mpachetării unui obiect (moment ı̂n care se mar-
chează faptul că s-a finalizat ı̂mpachetarea unui obiect s, i se resetează “cronome-
trul”).
12. Fiind dat un tablou de numere ı̂ntregi nesortate, transformat, i tabloul astfel ı̂ncât
să fie sortat ı̂n formă de “undă”. Un tablou arr[0...n − 1] este sortat ı̂n formă
de undă dacă arr[0] ≥ arr[1] ≤ arr[2] ≥ arr[3] ≤ arr[4] ≥ ....
Exemplu
Intrare: arr[] = {10, 5, 6, 3, 2, 20, 100, 80}
Ies, ire: arr[] = {10, 5, 6, 2, 20, 3, 100, 80} sau {20, 5, 10, 2, 80, 6, 100, 3} sau
alt tablou care respectă această formă

Intrare: arr[] = {20, 10, 8, 6, 4, 2}


Ies, ire: arr[] = {20, 8, 10, 4, 6, 2} sau {10, 8, 20, 2, 6, 4} sau alt tablou care
respectă această formă
Indicat, ie: Se ordonează crescător tabloul, după care se interschimbă valorile
elementelor vecine (primul cu al doilea, al treilea cu al patrulea, al cincilea cu al
s, aselea etc.).

18
13. Fiind dată o mult, ime de intervale, verificat, i dacă se suprapun două dintre acestea.
Exemplu

Intrare: arr[] = {[1, 3], [5, 7], [2, 4], [6, 8]}
Ies, ire: Adevărat. Intervalele [1, 3] s, i [2, 4] se suprapun

Intrare: arr[] = {[1, 3], [7, 9], [4, 6], [10, 13]}
Ies, ire: Fals. Nu există nicio pereche de intervale care să se suprapună

Indicat, ie: Se ordonează intervalele crescător după momentul de start s, i se com-


pară limita superioară a unui interval cu limita inferioară a intervalului următor.
Dacă prima valoare este mai mare decât a doua, atunci există suprapunere.

14. Se consideră un vector de numere distincte init, ial sortat ı̂n ordine crescătoare.
Vectorul a fost rotit ı̂n sensul acelor de ceasornic de k ori. Pornind de la vectorul
rotit, determinat, i valoarea lui k.
Exemplu:

Intrare: v = {15, 18, 2, 3, 6, 12},


Ies, ire: 2

Explicat, ie: Vectorul init, ial este {2, 3, 6, 12, 15, 18}. Din el se obt, ine vectorul dat
după 2 rotat, ii.
Indicat, ie: Se determină cel mai mic indice i cu proprietatea că valoarea ele-
mentului de pe pozit, ia i este mai mare decât valoarea elementului de pe pozit, ia
i + 1.

1.7 Prelucrări asupra şirurilor de caractere

Tematică
Algoritmi de prelucrare a s, irurilor de caractere:

ˆ Separarea unui text ı̂n cuvinte.

ˆ Analiza proprietăt, ilor unui s, ir de caractere (de exemplu, numărul de consoane/


vocale cont, inute, anagrame etc.).

ˆ Verificarea satisfacerii unor reguli ı̂n construirea unui şir de caractere.

ˆ Găsirea de s, abloane ı̂n text.

Observat, ie: Problemele se vor rezolva fără a folosi funct, ii predefinite de prelucrare
a s, irurilor de caractere.

19
Probleme
1. Se dă un text de maxim 256 de caractere. Să se afle următoarele informat, ii
despre textul dat.

(a) Câte propozit, ii cont, ine textul? Separatorii de propozit, ie se consideră ca-
racterele: “”, “!” s, i “?”.
Obiectiv: Identificarea propozit, iilor din text
Indicat, ie: Se va defini o funct, ie care primes, te ca parametru textul s, i va
ı̂ntoarce numărul de propozit, ii din text.
În cadrul funct, iei se declară un tablou cu separatorii de propozit, ie.
Apoi se parcurge textul caracter cu caracter s, i se verifică dacă caracterul
curent se află ı̂n tabloul de separatori. Dacă da se va incrementa o variabilă
care ret, ine numărul de propozit, ii din text.
Observat, ie: Se presupune că nu există 2 separatori de propozit, ie unul după
altul de exemplu textul “Of!!!!!” nu este valid.
(b) Pentru fiecare dintre propozit, iile din text să se determine numărul de cu-
vinte. Cuvintele unei propozit, ii sunt separate printr-un singur spat, iu. Scri-
et, i o funct, ie care ı̂ntoarce cea mai lungă propozit, ie din text (lungimea unei
propozit, ii este definită ca fiind numărul de cuvinte pe care le cont, ine).
Obiectiv: Identificarea cuvintelor din text, calcul maximului dintr-o secvent, ă
de valori
Indicat, ie: Se va defini o funct, ie care primes, te ca parametru textul s, i va
ı̂ntoarce numărul maxim de cuvinte dintr-o propozit, ie.
În cadrul funct, iei se declară un tablou cu separatorii de propozit, ie.
Apoi se parcurge textul caracter cu caracter s, i se verifică dacă caracterul
curent este spat, iu. Dacă da, se va incrementa o variabilă care ret, ine numărul
de cuvinte din text.
Observat, ie: Atent, ie la ultimul cuvânt din text, dacă după el nu este spat, iu
nu se va număra.
(c) Scriet, i o funct, ie care returnează numărul de vocale s, i consoane din textul
dat.
Obiectiv: Parcurgerea unui text, numărarea caracterelor care apart, in unei
mult, imi
Indicat, ie: Se va defini o funct, ie care primes, te ca parametri textul s, i două
referint, e ı̂n care se vor stoca (ı̂ntoarce) numărul de consoane s, i numărul de
vocale.
În cadrul funct, iei se declară un tablou care cont, ine vocalele (litere mari s, i
mici).
Apoi se parcurge textul caracter cu caracter s, i se verifică dacă caracterul
curent este ı̂n intervalul [‘a’ . . . ‘z’] sau [‘A’ . . . ‘Z’]. Dacă este literă,
se verifică dacă apart, ine mult, imii de vocale şi, ı̂n caz afirmativ, se cres, te
numărul de vocale, altfel se cres, te numărul de consoane.

2. Anagrame (un cuvânt este anagrama altui cuvânt dacă este constituit din aceleas, i
litere dar ı̂n altă ordine). De exemplu, “arc” este anagramă a cuvântului “rac”.

20
(a) Să se scrie o funct, ie care să verifice dacă, ı̂ntr-o pereche de cuvinte, un
cuvânt este anagrama celuilalt cuvânt.
Obiectiv: Verificarea proprietăt, ilor unui cuvânt
Indicat, ie: Se va defini o funct, ie care primes, te ca parametri două cuvinte
(s, iruri de caractere) s, i ı̂ntoarce o valoare care specifică dacă cuvintele sunt
sau nu anagrame.
Dacă cuvintele nu au aceeas, i lungime ele nu sunt anagrame.
Dacă cuvintele au aceeas, i lungime:
ˆ se construiesc vectori de frecvent, e pentru fiecare cuvânt (de câte ori
apare o literă ı̂n cuvânt);
ˆ se verifică dacă vectorii de frecvent, e sunt identici, iar ı̂n caz afirmativ
cuvintele sunt anagrame.
Observat, ie: O altă implementare se poate baza pe construirea mult, imii de
litere pentru fiecare cuvânt ı̂n ordine crescătoare s, i apoi se verifică dacă cele
două mult, imi sunt identice.
(b) Să se scrie o funct, ie care verifică dacă o mult, ime de cuvinte este formată din
anagrame ale aceluias, i cuvânt. De exemplu, mult, imea “arc”, “rac”, “car”
satisface proprietatea cerută.
Obiectiv: Verificarea proprietăt, ilor unei mult, imii
Indicat, ie: Se va defini o funct, ie care primes, te ca parametri o mult, ime de
cuvinte (tablou de s, iruri de caractere) s, i ı̂ntoarce o valoare care specifică
dacă toate cuvintele din mult, ime sunt anagrame.
Se defines, te o variabilă care va stoca o valoare (o numim esteAnagrama)
care reprezintă faptul că presupunem că proprietatea pe care vrem sa o
verificăm este adevărată.
Se parcurge mult, imea de cuvinte ı̂ncepând cu al doilea element al mult, imii
s, i se verifică dacă primul element al mult, imii s, i elementul curent sunt ana-
grame (folosind funct, ia definită mai sus). Dacă nu sunt, atunci valoarea
variabilei esteAnagrama se modifică pentru a reflecta că proprietatea nu
mai este satisfăcută.
(c) Să se scrie o funct, ie care afis, ează pentru o mult, ime de cuvinte toate perechile
de cuvinte anagrame.
Obiectiv: Generarea submult, imilor unei mult, imi care verifică o proprietate
Indicat, ie: Se va defini o funct, ie care primes, te ca parametri o mult, ime de
cuvinte (tablou de s, iruri de caractere) s, i va afis, a submult, imile formate din
cuvinte anagramate.
Pentru a rezolva problema putem să considerăm un tablou de aparit, ii care
să ne spună dacă cuvântul a fost sau nu folosit (afis, at).
Se parcurge tabloul de cuvinte s, i, pentru fiecare cuvânt, se verifică dacă
există un alt cuvânt care este anagrama acestuia (folosind funct, ia anterioară
care verifică dacă două cuvinte sunt anagrame). Un cuvânt deja afişat este
marcat (reţinut ı̂n tabloul de apariţii) .

3. Să se genereze pentru un cuvânt dat toate prefixele s, i sufixele acelui cuvânt.
Exemplu: pentru cuvântul “paranteza”

21
ˆ prefixele sunt “p”, “pa”, “par”, “para”, “paran”, “parant”, “parante”, “pa-
rantez”
Obiectiv: Generarea unor s, iruri care satisfac anumite proprietăt, i
Indicat, ie: Problema este asemănătoare cu problema afis, ării elementelor unei
matrici aflate sub diagonala principală
ˆ Sufixele sunt “a”, “za”, “eza”, “teza”, “nteza”, “anteza”, “ranteza”, “aran-
teza”
Indicat, ie: Problema este asemănătoare cu problema afis, ării elementelor unei
matrici aflate deasupra diagonalei principale

4. Se dă un tablou de cuvinte, format doar din litere mici. Afis, at, i s, irul de litere
din care sunt formate cuvintele ı̂n ordinea descrescătoare a literelor. Exemplu:
pentru mult, imea de cuvinte “ana”, “are”, “mere” se obt, ine rrnmeeeaaa.
Obiectiv: Folosire tablou de frecvent, e
Indicat, ie: Se va defini o funct, ie care primes, te ca parametru un tablou de cuvinte
(eventual lungimea tabloului).
Se va declara un tablou ı̂n care să se poată ret, ine frecvent, a de aparit, ie a fiecărei
litere ı̂n tabloul de cuvinte. Elementele tabloului vor fi init, ializate cu 0.
Se vor parcurge toate elementele tabloului si pentru fiecare element (cuvânt)
se vor parcurge literele din care este format s, i se va incrementa ı̂n tabloul de
frecvent, e valoarea care corespunde indexului din tablou atas, at literei. De exem-
plu dacă litera a apare de 3 ori ı̂n text, frecvent, a atas, ată literei a va fi 3.
După construirea tabloului de frecvent, e, acesta se va parcurge de la sfârs, it spre
ı̂nceput s, i, pentru fiecare valoare diferită de 0, se va crea un ciclu pentru a afis, a
litera de n ori.

5. Se dă un text s, i un cuvânt pe care vrem să ı̂l căutăm ı̂n text. Propunet, i funct, ii
care realizează următoarele variante de căutări:

(a) Identifică prima aparit, ie a cuvântului ı̂n text s, i returnează indexul la care
ı̂ncepe cuvântul căutat (nu folosit, i ı̂n implementarea algoritmului funct, ii
deja implementate ı̂n biblioteci care realizează acelas, i lucru). În cazul ı̂n
care cuvântul nu este prezent ı̂n text va ı̂ntoarce valoarea −1. De exemplu,
pentru textul “Ana are mere” şi cuvântul “are” se va returna 4, iar pentru
cuvântul “care” se va returna −1.
Obiectiv: Găsirea unui subs, ir ı̂ntr-un subs, ir (găsirea primei aparit, ii)
Indicat, ie: Se defines, te o funct, ie care are ca parametri două cuvinte (s, iruri de
caractere) s, i va ı̂ntoarce indexul la care ı̂ncepe prima aparit, ie a subs, irului ı̂n
s, ir (de exemplu pentru s, irul “abcdabcghbc” subs, irul “bc” se găses, te pentru
prima dată la pozit, ia 1, ı̂n cazul ı̂n care indicii ı̂ncep cu 0).
Pentru rezolvare se poate folosi algoritmul fort, ei brute care presupune par-
curgerea secvent, ială a primului s, ir (caracter cu caracter) s, i verificarea fap-
tului dacă nu cumva subs, irul ı̂ncepe la acea pozit, ie.
(b) Identifică toate aparit, iile cuvântului ı̂n text s, i returnează un tablou care
cont, ine indecs, ii la care ı̂ncepe cuvântul căutat.
Obiectiv: Găsirea unui subs, ir ı̂ntr-un subs, ir (găsirea tuturor aparit, iilor)

22
Indicat, ie: De exemplu, pentru s, irul “abcdabcghbc” subs, irul “bc” se găses, te
pe pozit, iile [1, 5, 9].
Se repetă prelucrarea de la subpunctul anterior.
(c) Identifică ultima aparit, ie a cuvântului ı̂n text s, i returnează indexul la care
ı̂ncepe cuvântul căutat, ı̂n caz contrar va ı̂ntoarce valoarea −1.
Obiectiv: Găsirea unui subs, ir ı̂ntr-un subs, ir (găsirea ultimei aparit, ii)
Indicat, ie: De exemplu, pentru s, irul “abcdabcghbc” subs, irul “bc” se găses, te
pe pozit, ia 9.
Pentru rezolvare se poate folosi algoritmul fort, ei brute care presupune par-
curgerea secvent, ială a primului s, ir (caracter cu caracter) s, i verificarea faptu-
lui dacă nu cumva subs, irul ı̂ncepe la acea pozit, ie. În acest caz, pentru a face
algoritmul put, in mai eficient, ı̂n unele cazuri, se poate porni cu verificarea
de la sfârs, itul s, irului.

6. Elevii unei clase trebuie să trimită rezolvările temelor la informatică sub forma
unei arhive zip care trebuie să respecte următorul s, ablon de denumire
clasaX nume premune zi-luna-an.zip. Temele care sunt trimise s, i nu res-
pectă acest format de numire nu vor fi corectate.
Exemplu:

ˆ Dacă elevul Ionescu Ion din clasa a noua trimite următorul fis, ier
clasa9 ionescu ion 02-04-2018.zip, tema lui va fi luată ı̂n considerare
pentru corectare.
ˆ Dacă elevul Vasilescu Vasile din clasa a unsprezecea trimite următorul fis, ier
clasa 11 vasilescu vasile 02-03 2018.zip, tema lui nu va fi luată ı̂n
considerare pentru corectare.

Cerint, e:

(a) Definit, i o funct, ie care permite profesorului să verifice dacă numele fis, ierului
trimis este corect sau nu (validarea se va face doar din punctul de vedere al
structurii denumirii).
Obiectiv: Verificarea dacă un s, ir de caractere respectă un s, ablon (pattern)
Indicat, ie: Se va căuta, pentru ı̂nceput, dacă există s, iruri de caractere preci-
zate care trebuie să se regăsească pe anumite pozit, ii. De exemplu, subs, irul
“clasa” trebuie să fie la ı̂nceputul cuvântului, iar subs, irul “.zip” la sfârs, itul
cuvântului. Apoi trebuie identificat, i separatorii, ı̂n exemplul curent “ ”
(liniut, ă de subliniere) s, i “-” (cratimă). Apoi se verifică dacă subs, irurile
dintre aces, tia respectă regulile impuse de s, ablon.
(b) Profesorul s, i-a construit un tablou cu nume de fis, iere. Determinat, i câte
fis, iere cu formatul corect au fost trimise.
Obiectiv: Verificarea ı̂ndeplinirii unei proprietăt, i a elementelor unui tablou
Indicat, ie: Se va defini o funct, ie care primes, te ca parametru tabloul de
cuvinte, eventual s, i lungimea tabloului s, i ı̂ntoarce numărul de cuvinte din
s, ir care respectă s, ablonul definit mai sus.
Obiectiv: Crearea unui nou s, ir de caractere pe baza proprietăt, ilor unui alt
s, ir de caractere

23
Indicat, ie: Se va parcurge tabloul de cuvinte s, i se va folosi funct, ia definită
la punctul (a) pentru a verifica dacă fiecare element al tabloului respectă
sau nu s, ablonul. Dacă ı̂l respectă, atunci se va cres, te valoarea variabilei ı̂n
care se ret, ine numărul de elemente care respectă s, ablonul.
(c) Ajutat, i profesorul să creeze o statistică care să ı̂i spună câte teme are de
corectat la fiecare clasă pornind de la tablourile cu nume de fis, iere cores-
punzătoare diferitelor clase (câte fis, iere ı̂n formatul corect au fost trimise
pentru fiecare clasă).
Obiectiv: Creare de tabele de frecvent, ă, identificare chei ale tabelului de
frecvent, ă
Inidicat, ie: Pentru a simplifica problema, vom presupune că clasele sunt de
la 0 la 12 (s, i ı̂n s, coală există o singură clasă pentru fiecare an).
În acest caz, ne putem folosi de ideea de la tabloul de frecvent, e pentru a
număra cât, i elevi au submis fis, iere ı̂n formatul corect, pentru fiecare clasă.
Observat, ie: Încercat, i să rezolvat, i problema ı̂n cazul general, când nu s, tim
câte clase de aceleas, i fel sunt ı̂n s, coală (de exemplu, există clasele 9A, 9B, 9C
s, i clasele 10A, 10B).

7. Se dores, te reducerea numărului de caractere pe care este stocat un text (compri-


marea textului) prin ı̂nlocuirea caracterelor succesive care se repetă cu caracterul
care se repetă s, i numărul de repetări. De exemplu, textul “abbcdeeeeff” va de-
veni “ab2cde4f”.

(a) Propunet, i un algoritm de comprimare a unui text.


Obiectiv: Modificări asupra unui s, ir de caractere (inserare/s, tergere)
Obiectiv: Crearea unui nou s, ir de caractere pe baza proprietăt, ilor unui alt
s, ir de caractere
Indicat, ie: Se defines, te o funct, ie care primes, te ca parametru un s, ir de ca-
ractere s, i returnează noul s, ir de caractere.
Se parcurge caracter cu caracter s, irul init, ial s, i dacă două litere succesive
sunt identice, atunci se măres, te un contor ı̂n care se stochează numărul de
litere identice găsite până ı̂n momentul curent, iar dacă două litere succesive
sunt diferite, atunci se adaugă, ı̂n noul s, ir, litera. Dacă numărul de aparit, ii
este mai mare ca 1 se adaugă s, i el, apoi se resetează contorul la 1 deoarece
s-a găsit o nouă literă.
(b) Pornind de la un text comprimat, propunet, i un algoritm prin care obt, inet, i
textul init, ial (de exemplu, “ab2cde4f2” devine “abbcdeeeeff”).
Obiectiv: Generarea unui s, ir de caractere care respectă anumite proprietăt, i
Indicat, ie: Se defines, te o funct, ie care primes, te ca parametru un s, ir de ca-
ractere s, i returnează noul s, ir de caractere.
Obiectiv: Înlocuirea unui subs, ir de caractere cu alt subs, ir de caractere ı̂ntr-
un s, ir
Indicat, ie: Se defines, te o funct, ie care primes, te ca argumente două s, iruri de
caractere (unul reprezintă cuvântul init, ial s, i celălalt cuvântul ı̂n păsărească)
s, i ı̂ntoarce o valoare de adevăr care specifică dacă cuvântul init, ial a fost
corect transformat ı̂n păsărească.

24
Se parcurge, caracter cu caracter, s, irul init, ial s, i dacă caracterul e literă,
atunci se adaugă la noul s, ir, iar dacă e cifră, atunci se transformă ı̂n număr
pentru a afla numărul de repetări al literei. După ce am aflat numărul de
repetări ale literei, adăugam la noul s, ir litera, de numărul de ori identificat.
Observat, ie: Numărul de caractere care se repetaa poate fi mai mare de 9,
deci rezultă că cifrele sunt formate din două sau mai multe caractere.

8. Elevii unei clase s, i-au propus să ı̂nvet, e limba păsărească astfel ı̂ncât au nevoie
de un program care să verifice dacă, pornind de la un cuvânt, au identificat
corect cuvântul ı̂n limba păsărească. Scriet, i o funct, ie care verifică dacă cuvântul
din păsărească este corect identificat/codificat. Funct, ia primes, te ca parametri
cuvântul ı̂n limba păsărească s, i cuvântul init, ial s, i ı̂ntoarce o valoare de adevăr
ı̂n funct, ie de codificare. Codificarea ı̂n limba păsărească presupune ı̂nlocuirea
fiecărei vocale astfel: “v” devine “vpv” şi păstrarea nemodificată a consoanelor
(de exemplu, “a” devine “apa”, iar “e” devine “epe”). De exemplu, cuvântul
“capre”, ı̂n păsărească, este “capaprepe”.
Indicat, ie: Se va codifica cuvântul init, ial ı̂n păsărească, apoi se vor verifica dacă
cele două cuvinte sunt identice.

9. Să se verifice că un cuvânt este palindrom (citit de la dreapta la stânga s, i de


la stânga la dreapta este acelas, i cuvânt). De exemplu, cuvântul “caiac” este
palindrom, iar cuvântul “cor” nu este.

(a) Propunet, i o variantă iterativă de rezolvare a problemei.


Obiectiv: Verificarea proprietăt, ilor unui s, ir de caractere, varianta iterativă
Indicat, ie: Se defines, te o funct, ie care primes, te ca argument un s, ir de ca-
ractere s, i ı̂ntoarce o valoare de adevăr care spune dacă funct, ia este sau nu
palindrom.
Se pornes, te cu doi iteratori: unul de la sfârs, itul s, irului s, i unul de la ı̂nceputul
s, irului. Atâta timp cât caracterele de pe pozit, iile indicate de cei doi iteratori
sunt egale, se descres, te iteratorul care pornes, te de la sfârs, itul s, irului s, i se
cres, te iteratorul de la ı̂nceputul s, irului, iar dacă cei doi iteratori ajung să
se depăs, ească ı̂nseamnă că este palindrom, altfel nu.
(b) Propunet, i o variantă recursivă de rezolvare a problemei.
Obiectiv: Verificarea proprietăt, ilor unui s, ir de caractere, varianta recursivă

10. Ionel scrie poezii, dar face mici gres, eli de tehnoredactare. Vom ı̂ncerca să ı̂l
ajutăm pe Ionel să corecteze gres, elile le tehnoredactare. Dacă versurile poeziei
sunt stocate ı̂ntr-un tablou de s, iruri de caractere (fiecare element din tablou
cont, ine un vers), trebuie să corectăm următoarele probleme:
Obiectiv: Adăugarea/s, tergerea de caractere dintr-un s, ir de caractere, generarea
de sufixe

(a) Deoarece dorim să folosim cât mai put, ine caractere pentru a stoca poezia,
va trebui să verificăm dacă există caractere albe (spat, ii s, i/sau taburi) la
ı̂nceputul s, i sfârs, itul fiecărui vers s, i să le eliminăm.
Indicat, ie: Se defines, te o funct, ie care primes, te ca argument poezia (un tablou
de s, iruri de caractere), eventual numărul de versuri (dimensiunea tabloului).

25
Se va parcurge fiecare vers al poeziei s, i pentru fiecare vers:
ˆ se verifică dacă ultimele caractere ale versului sunt caractere albe s, i se
s, terg prin deplasarea terminatorului de s, ir;
ˆ se verifică dacă primele caractere sunt caractere albe: dacă da, atunci
se deplasează versul cu un caracter la stânga.
(b) Din gres, eală, Ionel a adăugat mai multe caractere albe (spat, ii s, i taburi)
ı̂ntre două cuvinte, acestea trebuie ı̂nlăturate (de exemplu, “ O, ce păcat
, o, ce păcat”, “Că n-a fost fotografiat”, “ acel moment ı̂nălt, ător”,
“Când, singur cuc, Apolodor”, “ a găurit cu un topor”, “ Peret, ii
marelui vapor!...” se transformă ı̂n “O, ce păcat , o, ce păcat”, “Că n-a fost
fotografiat”, “Acel moment ı̂nălt, ător”, “Când, singur cuc, Apolodor”, ”A
găurit cu un topor”, “Peret, ii marelui vapor!...”.
Indicat, ie: Se defines, te o funct, ie care primes, te ca argument poezia (un tablou
de s, iruri de caractere), eventual numărul de versuri (dimensiunea tabloului).
Se va parcurge fiecare vers al poeziei s, i, pentru fiecare vers, se verifică,
caracter cu caracter, dacă două caractere succesive sunt caractere albe:
dacă da, atunci se deplasează restul versului cu un caracter la stânga.
(c) Fiecare vers trebuie să ı̂nceapă cu literă mare de tipar.
Indicat, ie: Se defines, te o funct, ie care primes, te ca argument poezia (un tablou
de s, iruri de caractere), eventual numărul de versuri (dimensiunea tabloului).
Se va parcurge fiecare vers al poeziei s, i, pentru fiecare vers, se verifică dacă
primul caracter este literă mică: dacă da, atunci se transformă ı̂n literă
mare (de exemplu, prin scăderea numărului de caractere dintre literele mici
s, i literele mari).
(d) O altă problemă este legată de faptul că uneori ı̂nainte de caracterele ’,’,
’ ?’, ’ !’ sau ’.’ s-a lăsat un spat, iu liber s, i acesta trebuie eliminat sau s-a
uitat să se lase spat, iu după virgulă, punct, semnul exclamării s, i semnul
ı̂ntrebării. De exemplu, “Când , singur cuc,Apolodor” trebuie ı̂nlocuit cu
“Când, singur cuc, Apolodor”.
Indicat, ie: Se defines, te o funct, ie care primes, te ca argument poezia (un tablou
de s, iruri de caractere), eventual numărul de versuri (dimensiunea tabloului).
Se va parcurge fiecare vers al poeziei s, i, pentru fiecare vers, se verifică dacă
caracterul curent este unul din caracterele: .,?!, iar dacă da:
ˆ Se verifică dacă ı̂naintea lui este spat, iu: dacă da, atunci se deplasează
s, irul rămas cu o pozit, ie la dreapta;
ˆ Se verifică dacă după el este spat, iu: dacă nu, atunci se deplasează s, irul
rămas cu o pozit, ie la dreapta s, i se adaugă spat, iul (Atent, ie: dacă este
spat, iu trebuie să deplasăm la dreapta; după ultimul caracter nu trebuie
să adăugăm spat, iu).
(e) Verificat, i tipul de rimă al poeziei: ı̂mperecheată (aabb), ı̂ncrucis, ată (abab),
ı̂mbrăt, is, ată (abba), monorima (aaaa) sau albă, ı̂n restul cazurilor. Spunem
că două cuvinte “rimează” dacă sufixele ı̂ncepând de la ultima vocală sunt
identice, sufixele trebuie să aibă lungimea strict mai mare ca 1.
Indicat, ie: Se defines, te o funct, ie care primes, te ca argument poezia (un tablou
de s, iruri de caractere), din poezie luăm ı̂n considerare doar primele patru
versuri (pe baza lor determinăm tipul de rimă).

26
Pentru fiecare vers din cele patru se ret, ine sufixul.
După ce s-au obt, inut sufixele, se verifică tipul de rimă.

11. Determinat, i numărul de cuvinte “magice” dintr-o propozit, ie. Cuvintele propo-
zit, iei sunt separate de spat, ii. Un cuvânt (L1 L2 L3 ...Ln−1 Ln ) este “magic” dacă
satisface următoarea proprietate |Li − Li+1 | = |Ln−i − Ln−i−1 |, pentru oricare
i = 1...n. De exemplu, ı̂n propozit, ia “Miss Arora teaches us malayalam bdwy”
sunt 4 astfel de cuvinte: Arora, us, Malayalam, bdwy.
Indicat, ie: Se defines, te o funct, ie care primes, te ca argument propozit, ia (un s, ir de
caractere), se parcurg literele propozit, iei, iar când se ı̂ntâlnes, te caracterul spat, iu,
se consideră că s-a găsit un cuvânt s, i se verifică proprietatea de cuvânt “magic”.

1.8 Structuri de date pentru grafuri

Tematică
Concepte s, i modalităt, i de reprezentare pentru grafuri neorientate, grafuri orientate,
arbori

ˆ Reprezentarea grafurilor neorientate, a grafurilor orientate şi a arborilor

ˆ Algoritmi de traversare şi analiză a grafurilor şi arborilor

ˆ Proprietăţi ale grafurilor

ˆ Aplicaţii

Probleme
1. Se citeşte un graf neorientat din fişierul muchii.txt ı̂n care avem pe prima linie
numărul n de noduri şi cel de muchii separate prin spaţiu, iar pe fiecare din
liniile următoare avem nodurile unei muchii separate prin spaţiu. Se presupune
că n ≤ 50.

(a) Pentru fiecare nod, afişaţi gradul şi muchiile incidente la acel nod.
(b) Afişaţi numărul de noduri şi matricea de adiacenţă a grafului.

2. Se citesc două grafuri neorientate, unul cu n ≤ 100 vârfuri şi m muchii, iar celălalt
cu k ≤ 100 vârfuri şi r muchii, ambele reprezentate prin lista de muchii.
Să se determine dacă al doilea graf este subgraf al primului graf.

3. Se dă un graf neorientat cu n ≤ 100 noduri, pentru care se cunoaşte matricea


de adiacenţă a. Să se determine componentele conexe ale grafului şi apoi să se
indice:

(a) numărul de componente conexe


(b) pentru fiecare componentă conexă:

27
ˆ nodurile care fac parte din componenta respectivă
ˆ dacă are sau nu un ciclu.

4. Se dă un graf neorientat cu n ≤ 50 noduri, pentru care se cunoaşte matricea de


adiacenţă a. Determinaţi numărul minim de culori cu care se pot colora nodurile
grafului astfel ı̂ncât oricare două noduri adiacente să aibe culori diferite. Afişaţi
pentru fiecare culoare nodurile care se colorează cu ea.
5. Se citeşte un graf orientat din fişierul muchii.txt ı̂n care avem pe prima linie
numărul n de noduri şi cel de muchii separate prin spaţiu, iar pe fiecare din
liniile următoare avem nodurile unei muchii separate prin spaţiu. Se presupune
că n ≤ 50. Apoi se citeşte de la consolă un număr ı̂ntreg m astfel ı̂ncât 0 < m ≤ n.
Să se afişeze:
(a) Câte subgrafuri cu m noduri ale grafului citit sunt circuite elementare.
(b) Numărul maxim de muchii al unui subgraf cu m noduri.
6. Se dă un graf orientat cu n ≤ 50 noduri, care se citeşte dintr-un fişier text
muchii.txt ı̂n care avem pe prima linie numărul n de noduri şi cel de muchii se-
parate prin spaţiu, iar pe fiecare din liniile următoare avem nodurile unei muchii
separate prin spaţiu. S, tiind că:
ˆ Un drum hamiltonian este un drum care vizitează fiecare nod al grafului
exact o dată. Un ciclu hamiltonian este un ciclu care vizitează fiecare nod
o singură dată (cu except, ia nodului care este s, i primul s, i ultimul). Un graf
care cont, ine un ciclu hamiltonian se numes, te graf hamiltonian.
ˆ Un drum eulerian este un drum care traversează fiecare muchie exact o
dată. Un ciclu eulerian este un ciclu care parcurge fiecare muchie exact o
dată. Un graf care cont, ine un ciclu eulerian este numit graf eulerian.
să se determine
(a) Dacă graful este hamiltonian. Dacă este, să se afişeze un circuit hamilto-
nian.
(b) Dacă graful este eulerian. Dacă este, să se afişeze un circuit eulerian.
7. Se dă un arbore binar cu ≤ 100 noduri reprezentat prin vectorii de descendenţi
S şi D. Pentru fiecare nod i, S[i] este descendentul stâng al nodului i, şi D[i] este
descendentul drept al nodului i.
Dacă S[i] = 0 atunci nodul i nu are descendent stâng, iar dacă D[i] = 0 atunci
nodul i nu are descendent drept. Afişaţi pe rânduri separate:
ˆ Frunzele arborelui
ˆ Nodurile cu un singur descendent direct
ˆ Nodurile cu 2 descendenţi direcţi

8. Se dă un arbore binar cu ≤ 100 noduri reprezentat prin vectorii T şi P:


ˆ T[i] este nodul tată al nodului i; dacă nodul i nu are nod tată atunci
T[i] = 0.

28
ˆ P[i] = −1 dacă nodul i este descendent stâng; P[i] = 1 dacă nodul i este
descendent drept.

Calculaţi şi afişaţi vectorii S şi D de descendenţi ai nodurilor grafului:

ˆ S[i] este descendentul stâng al nodului i, şi


D[i] este descendentul drept al nodului i.
ˆ Dacă S[i] = 0 atunci nodul i nu are descendent stâng, iar dacă D[i] = 0
atunci nodul i nu are descendent drept.

9. Se citeşte un graf conex neorientat cu n ≤ 100 noduri şi m muchii etichetate prin
costui pozitive. Graful se citeşte dintr-un fişier text muchii.txt ı̂n care avem pe
prima linie numărul n de noduri şi numărul m de muchii separate prin spaţiu, iar
pe fiecare din liniile următoare avem nodurile şi costul unei muchii separate prin
spaţiu. Se presupune că ı̂n fişier, muchiile apar ı̂n ordinea crescătoare a costului
lor.
Să se determine un arbore de acoperire cu cost minim al grafului citit, şi să se
afişeze muchiile acestuia.

29
Capitolul 2

Subiecte date la Concursul FMI

2.1 Edit, ia a III-a (2017)


1. Un număr natural nenul este considerat binar simetric dacă reprezentarea sa ı̂n
baza 2 este un s, ir simetric (prima cifră binară coincide cu ultima, a doua cu
penultima etc.). De exemplu, 27 este binar simetric ı̂ntrucât s, irul binar cores-
punzător 110011 este simetric.

(a) Scriet, i o funct, ie (C/C++/Pascal) care primes, te ca parametru de intrare un


număr natural s, i returnează numărul de cifre binare (de exemplu, 27 are 5
cifre binare).
(b) Scriet, i o funct, ie (C/C++/Pascal) care primes, te ca parametru de intrare un
număr natural n s, i o valoare k cuprinsă ı̂ntre 1 s, i numărul de cifre binare
ale lui n s, i returnează cifra binară de ordin k (cifra binară de ordin 1 este
cea mai put, in semnificativă).
(c) Scriet, i o funct, ie (C/C++/Pascal) care primes, te ca parametru de intrare un
număr natural s, i returnează 1 dacă numărul este binar simetric s, i 0 ı̂n caz
contrar. Pentru verificarea proprietăt, ii nu se vor folosi tablouri.

2. Se consideră un s, ir de numere ı̂ntregi distincte, nu neapărat ordonat, s, i se pune


problema descompunerii sale ı̂ntr-un numar cât mai mic de subs, iruri crescătoare
astfel ı̂ncât fiecare element din s, irul init, ial să se afle exact ı̂ntr-un subs, ir, iar ordi-
nea relativă dintre elementele s, irului init, ial să se conserve s, i ı̂n cazul subs, irurilor.
De exemplu, s, irul init, ial (13, 4, 21, 16, 18, 5, 3) se poate descompune ı̂n subs, irurile
{(13, 21), (4, 16, 18), (5), (3)} sau ı̂n subs, irurile {(13, 16, 18), (4, 5), (21), (3)}.

(a) Propunet, i o metodă de construire a subs, irurilor.


(b) Scriet, i programul (C/C++/Pascal) care implementează metoda propusă.
Programul va citi de la tastatură s, irul de numere s, i va afis, a subs, irurile
determinate.

3. Se consideră o matrice pătratică de dimensiune n × n cu elemente numere reale


s, i se pune problema reorganizării ei astfel ı̂ncât la parcurgerea elementelor ı̂n
spirală, pornind de la elementul din colt, ul din stânga sus, ı̂n sensul acelor de
ceasornic, să se obt, ină un s, ir ordonat crescător.

30
(a) Scriet, i o funct, ie/procedură (C/C++/Pascal) care construies, te un tablou
ordonat crescător ce cont, ine toate cele n2 elemente ale matricii.
(b) Scriet, i o funct, ie/procedură (C/C++/Pascal) care plasează elementele din
tabloul construit la etapa anterioară, sub forma unei spirale care ı̂ncepe din
colt, ul Stânga-sus al matricii, ı̂n sensul acelor de ceasornic.

Exemplu: Intrare:
1 4 2 5
3 5 7 9
0 8 7 4
1 3 5 2

Rezultat:

(a) 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 7, 7, 8, 9
(b)

4. Se consideră o succesiune de (n − 1 celule care cont, in operatori de inegalitate


(“<”, respectiv“>”) s, i se dores, te să se plaseze toate valorile naturale 1, 2, . . . , n
ı̂ntre celule (inclusiv ı̂naintea primeia s, i după ultima) astfel ı̂ncât orice triplet
de elemente consecutive < număr, operator, număr > să exprime relat, ia corectă
dintre cele două numere.
Exemplu: Pentru succesiunea de operatori:
> < < > > <
se poate obt, ine (solut, ia nu este unică):
2 > 1 < 3 < 6 > 5 > 4 < 7
Scriet, i un program (C/C++/Pascal) care cites, te de la tastatură secvent, a de ope-
ratori (ca s, ir de caractere) s, i afis, ează o secvent, ă de valori s, i operatori intercalate
care satisfac cerint, ele (pentru exemplul de mai sus se cites, te “><<>><” s, i se
afis, ează 2 > 1 < 3 < 6 > 5 > 4 < 7).

Notă:

1. Pentru funct, ii/proceduri se vor specifica parametrii s, i se vor declara variabilele


locale (dacă este cazul).

2. În cazul fiecărei probleme se va descrie ideea de rezolvare ı̂n limbaj natural sau
se vor pune comentarii explicative ı̂n cadrul codului.

31
BAREM
Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
Problema 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15 pct.
(a) (definire funct, ie, declarat, ii - 1p, calcul corect număr bit, i - 4p) . . . . . . 5 pct
(b) (definire funct, ie, declarat, ii - 1p, calcul corect cifra binară - 4p) . . . . . .5 pct
(c) (definire funct, ie, declarat, ii - 1p, verificare simetrie - 4p) . . . . . . . . . . . . .5 pct
Problema 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25 pct.
(a) (descrierea unei metode corecte de construire a subs, irurilor) . . . . . . . 10 pct
(b) (declarat, ii - 1p, citire s, ir - 1p, afis, are subs, iruri - 3p, construire subs, iruri -
10p) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 pct
Problema 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 pct.
(a) (definire funct, ie, declarat, ii - 1p, parcurgere matrice - 2p, construire tablou
ordonat - 7p) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct
(b) (construire matrice cu elemente plasate corect) . . . . . . . . . . . . . . . . . . . . 20 pct
Problema 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20 pct.
(declarat, ii - 1p, citire s, ir operatori - 1p, construirea unui s, ir de valori ce satisface
restrict, iile - 15p, afis, are secvent, a de valori si operatori intercalate - 3p)

32
2.2 Edit, ia a IV-a (2018)
1. (30p)

(a) (5p) Se consideră funct, ia f : N∗ × N∗ → N definită prin:


(
m dacă m < n
f (m, n) =
f(m-n, n) dacă m ≥ n

i. Scriet, i o funct, ie recursivă ı̂n C/Pascal care primes, te doi parametri m


s, i n de tip ı̂ntreg s, i returnează valoarea f (m, n);
ii. Ce returnează funct, ia atunci când este apelată pentru două valori na-
turale nenule?
(b) (5p) Se s, tie că orice număr natural nenul poate fi scris, ı̂n mod unic, ca
o sumă de termeni distinct, i care sunt puteri naturale ale 2. De exemplu,
9 = 23 + 20 , 15 = 23 + 22 + 21 + 20 , 32 = 25 . Scriet, i o funct, ie care primes, te
ca parametru un număr natural nenul, n, s, i returnează returnează numărul
de termeni distict, i din descompunerea lui n ca sumă de puteri ale lui 2.
(c) (5p) Se consideră un număr natural mare (ce cont, ine cel put, in 100 de cifre)
specificat prin secvent, a cifrelor sale, (ck , ck−1 , . . . , c1 , c0 ) (cu ck cifra cea
mai semnificativă s, i c0 cifra cea mai put, in semnificativă). Scriet, i o funct, ie
care primes, te ca parametri numărul de cifre s, i un tablou ce cont, ine cifrele
numărului s, i returnează 1 dacă numărul este divizibil cu 15 s, i 0 ı̂n caz
contrar.
(d) (5p) Se consideră o matrice pătratică A cu n linii s, i n coloane s, i se presupune
că elementele aflate sub diagonala principală sunt stocate ı̂ntr-un tablou
prin parcurgerea linie cu linie a matricii. Tabloul va cont, ine elementele
a21 , a31 , a32 , a41 , a42 , a43 . . . . Presupunând că indicii tabloului pornesc de la
1, stabilit, i care este indicele ı̂n tablou al elementului aij din matrice (i > j) :
i. (j − 2)(j − 1)/2 + i;
ii. (i − 2)(i − 1)/2 + j;
iii. (i − 2)(j − 1)/2 + i;
iv. (j − 2)(i − 1)/2 + j;
v. niciuna dintre variante nu e corectă.
(e) (5p) Coeficientul de “palindromitate” al unui s, ir de numere naturale (b1 , b2 ,
. . . , bk ) se defines, te ca fiind numărul minim de operat, ii de incrementare
care ar trebui aplicate unor elemente din s, ir, astfel ı̂ncât s, irul să devină
palindrom (b1 = bk , b2 = bk−1 etc.).
i. Scriet, i relat, ia matematică de calcul a coeficientului de “palindromi-
tate”;
ii. Scriet, i o funct, ie care primes, te ca parametru un tablou cu valori naturale
s, i returnează valoarea coeficientului.
(f) (5p) Se consideră un graf neorientat cu n = 6 noduri specificat prin lista
muchiilor sale: (1, 2), (1, 3), (2, 3), (2, 4), (3, 6), (4, 5), (4, 6), (5, 6).
i. Desenet, i graful.

33
ii. Este graful conex?
iii. Care este numărul minim de muchii care ar trebui eliminate pentru
ca graful să devină conex? Dat, i un exemplu de muchii prin a căror
eliminare graful devine neconex.

2. (20p) Se consideră un set de n (10 ≤ n ≤ 100) segmente de dreaptă specificate


prin coordonatele extremităt, ilor lor care sunt stocate ı̂ntr-o matrice A cu n linii
s, i 4 coloane având elemente numere reale. Fiecare linie din matrice cont, ine coor-
donatele a două puncte ı̂n plan: ai1 s, i ai2 reprezintă abscisa, respectiv ordonata
primei extremităt, i, iar ai3 s, i ai4 reprezintă abscisa, respectiv ordonata celei de a
doua extremităt, i.

(a) (5p) Scriet, i o funct, ie/procedură care afis, ează numărul de segmente de dreap-
tă orizontale s, i numărul de segmente de dreaptă verticale.
(b) (5p) S, tiind că lungimea unui segment determinat
p de două puncte având co-
ordonatele (xi , yi ), respectiv (xj , yj ) este (xi − xj )2 + (yi − yj )2 , scriet, i o
funct, ie care primes, te ca parametri coordonatele a două puncte s, i returnează
lungimea segmentului determinat de ele.
(c) (10p) Scriet, i o funct, ie/procedură care transformă matricea A, astfel ı̂ncât
liniile sale să fie ordonate crescător după lungimea segmentului pe care ı̂l
reprezintă.

3. (20p) Pentru un număr natural n definim d(n) ca fiind suma dintre n s, i suma
cifrelor sale. De exemplu, d(75) = 75 + 7 + 5 = 87. Numărul n este considerat
generator pentru d(n) (75 este generator pentru 87). Un număr natural nenul m
este considerat auto-număr dacă nu există niciun număr n < m cu proprietatea
că n este generator pentru m (adică m 6= d(n) pentru orice n < m).

(a) (5p) Scriet, i o funct, ie care primes, te un număr natural n s, i returnează valoa-
rea lui d(n).
(b) (10p) Scriet, i o funct, ie care determină numărul maxim de generatori pe care
ı̂i poate avea un număr cu k cifre (2 ≤ k ≤ 4).
(c) (5p) Scriet, i o funct, ie/procedură care afis, ează toate auto-numerele care au
cel mult k cifre (2 ≤ k ≤ 4).

4. (20p) Se consideră un set S de m s, iruri de caractere ce cont, in simboluri din


mult, imea {a, b} s, i se pune problema identificării unor subs, iruri cât mai lungi
care verifică s, ablonul “an ban ”=“aa . . . a}” (n ≥ 1). De exemplu, ı̂n s, irul
. . . a} b |aa {z
| {z
n ori n ori
“abbaaabaaabaab” cel mai lung subs, ir care respectă s, ablonul este “aaabaaa” (cu
n = 3).

(a) (10p) Scriet, i o funct, ie care primes, te ca parametru un s, ir de caractere s, i


returnează valoarea n corespunzătoare celui mai lung subs, ir care respectă
s, ablonul. Dacă un astfel de subs, ir nu există, se returnează 0.
(b) (10p) Declarat, i o variabilă ı̂n care se poate stoca setul de s, iruri de caractere.
Scriet, i o funct, ie care afis, ează cel mai lung subs, ir care respectă s, ablonul s, i
este comun tuturor s, irurilor din setul S.

34
Notă:

1. Limbajul de programare este la alegere ı̂ntre C/C++ s, i Pascal.

2. Pentru fiecare dintre funct, iile/subprogramele scrise se vor specifica toate decla-
rat, iile de variabile globale s, i locale necesare s, i se vor pune comentarii explicative.
NU este necesară scrierea programului principal s, i nici preluarea datelor prin
citire.

BAREM
Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
Problema 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 pct.
1a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(i. descriere corectă a funct, iei recursive - 3p; ii. funct, ia determină restul
ı̂mpărt, irii ı̂ntregi a lui m la n - 2p)
1b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei, a variabilelor locale s, i returnarea rezultatului -
1p; contorizarea numărului de cifre egale cu 1 din reprezentarea ı̂n baza 2 a numărului
- 4p)
1c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei, a variabilelor locale s, i returnarea rezultatului
- 1p; verificare divizibilitate cu 3 (suma tuturor cifrelor este divizibilă cu 3) - 2p;
verificare divizibilitate cu 5 (cifra cea mai put, in semnificativă este 0 sau 5) - 2p)
1d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(ii. pozit, ia elementului aij ı̂n tablou este (i − 2)(i − 1)/2 + j - 5p)
1e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(i. [k/2]
P
i=1 |bi − bk−i+1 | - 2p; ii. declararea corectă a funct, iei, a variabilelor locale
s, i returnarea rezultatului - 1p; calculul corect al coeficientului - 2p)
1f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(i. desen corect al grafului - 1p; ii. da, graful este conex - 1p; iii. trebuie
eliminate minim două muchii - 2p; exemplu corect de muchii eliminate (de exemplu,
(2, 4) s, i (3, 6) - 1p)
Problema 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20 pct.
2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei, a variabilelor locale s, i afis, area rezultatelor - 1p;
contorizarea corectă a segmentelor orizontale (segmentul i este orizontal dacă ai2 = ai4 ,
respectiv vertical dacă ai1 = ai3 ) - 4p)
2b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei, a variabilelor locale s, i returnarea rezultatului -
1p; descrierea corectă a calculului lungimii unui segment - 4p)

35
2c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea corectă a funct, iei, a variabilelor locale/globale - 1p; implementarea
corectă a algoritmului de sortare folosind funct, ia de la punctul (b) drept criteriu de
sortare - 9p)
Problema 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20 pct.
3a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei, a variabilelor locale s, i returnarea rezultatului -
1p; calcul sumă cifre - 3p; calcul corect d(n) - 1p)
3b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea corectă a funct, iei, a variabilelor locale s, i afis, area rezultatelor - 1p;
construirea unui tabel de frecvent, e corespunzător valorilor de tip d(i) calculate pentru
valori ale lui i cuprinse ı̂ntre 1 s, i 10k − 1 - 7p; determinarea valorii maxime din tabelul
de frecvent, e - 2p)
3c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei, a variabilelor locale s, i afis, area rezultatelor -
1p; generarea corectă a auto-numerelor (de exemplu, parcurgând tabelul de frecvent, e
construit la punctul anterior) - 4p)
Problema 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20 pct.
4a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea corectă a funct, iei, a variabilelor locale s, i returnarea rezultatului -
1p; analiza tuturor subs, irurilor care respectă s, ablonul (de exemplu, pornind de la un
subs, ir de forma “aba” s, i extinzându-l ı̂nspre stânga s, i dreapta cât este posibil) - 6p;
determinarea corectă a parametrului n corespunzător s, ablonului de lungime maximă
- 3p)
4b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea unei variabile care stochează setul de s, iruri de caractere - 2p;
declararea corectă a funct, iei s, i a variabilelor locale - 1p; determinarea pentru fiecare
s, ir din set a lungimii maxime a unui subs, ir care respectă s, ablonul (folosind funct, ia de
la punctul (a)) - 3p; determinarea valorii minime dintre lungimile maxime determinate
- 2p; afis, area corectă a s, ablonului comun - 2p)

36
2.3 Edit, ia a V-a (2019)
1. (50p)

(a) (10p) Se consideră două numere naturale nenule x s, i y. Să se construiască


cel mai mare număr z care este constituit din cifrele distincte care apar
atât ı̂n x cât s, i ı̂n y. De exemplu, pentru x = 46106 s, i y = 12156 se obt, ine
z = 61. Pentru determinarea lui z se vor scrie următoarele subprograme
(funct, ii/proceduri):
i. Un subprogram care primes, te ca parametru valorile x s, i y s, i construies, te
un tablou c cu 10 elemente având proprietatea: c[i] = 1 dacă i este cifră
comună celor două numere s, i 0 ı̂n caz contrar.
ii. Un subprogram care primes, te ca parametru tabloul c construit la punc-
tul i. s, i returnează numărul z.
(b) (10p) Se consideră o bucată dreptunghiulară de tablă de lungime m s, i lăt, ime
n (m s, i n sunt numere naturale) s, i se pune problema sect, ionării ei exacte
ı̂ntr-un număr cât mai mic de bucăt, i identice de formă pătrată.
i. Descriet, i pe scurt s, i argumentat, i modul ı̂n care poate fi calculată lun-
gimea laturii pătratului s, i numărul minim de tăieturi necesare pentru
a obt, ine toate pătratele.
ii. Scriet, i un subprogram care primes, te ca parametri valorile m s, i n s, i
afis, ează :
A. numărul minim de pătrate;
B. numărul minim de tăieturi.
(c) (5p) Se consideră funct, ia f : N × N → N definită prin:

0
 dacă b = 0
f (a, b) = f(2a, [b/2]) dacă b > 0, b este par

f(2a, [b/2]+a dacă b > 0, b este impar

unde [x] reprezintă partea ı̂ntreagă a numărului x.


i. Care este valoarea funct, iei f pentru:
A. a = 3, b = 4;
B. a = 4, b = 3;
C. a s, i b două numere naturale arbitrare.
ii. Scriet, i o funct, ie recursivă pentru calculul valorii f (a, b) pentru două
numere naturale a s, i b.
(d) (5p) Se consideră o matrice A cu m linii s, i n coloane s, i elemente din {0, 1}
care descrie relat, ia de prietenie pe o platformă socială (Aij = Aji = 1 dacă
i este prieten cu j s, i 0 ı̂n caz contrar). Scriet, i un subprogram (funct, ie) care
primes, te ca parametru matricea s, i afis, ează persoana (persoanele) care au
numărul maxim de prieteni.
(e) (5p) Se pune problema acoperirii unei table de dimensiune 2 × m folosind
piese de dimensiune 1 × 2 sau 2 × 1. Fie V (m) numărul de variante ı̂n care
poate fi acoperită tabla de piese.

37
i. Care dintre următoarele afirmat, ii este corectă?
2
A. V (m) = Cm ;
B. V (m) = m!;
C. V (1) = 1, V (2) = 2, V (m) + V (m − 1) + V (m − 2), pentru m > 2;
D. V (1) = 1, V (m) = 2V (m − 1), pentru m > 1.
ii. Argumentat, i alegerea făcută la punctul i.
(f) (15p) Se consideră un set de n puncte ı̂n plan date prin coordonatele lor car-
teziene (numere ı̂ntregi) stocate ı̂n două tablouri x s, i y s, i se pune problema
determinării numărului de linii drepte care trec prin originea sistemului de
axe de coordonate s, i cont, in cele n puncte.
i. Scriet, i un subprogram (funct, ie/procedură) care ordonează tablourile x
s, i y crescător după valoarea y/x (se presupune că toate valorile x sunt
nenule). După ordonare, punctele vor fi ı̂n ordinea crescătoare a pantei
dreptei determinată de origine s, i punctul respectiv.
ii. Scriet, i o funct, ie care primes, te tablourile x s, i y ordonate s, i returnează
numărul de linii distincte care trec prin origine s, i cont, in toate cele n
puncte.
2. (25p) Primarul oras, ului WWW dores, te să instaleze o cameră de luat vederi ı̂n oras, .
Se consideră că oras, ul are formă dreptunghiulară, cu străzi paralele s, i perpendi-
culare situate la distant, e egale. Dreptunghiul corespunzător oras, ului s, i străzile
aferente sunt modelate printr-o grilă cu dimensiunea M × N (2 ≤ M, N ≤ 1000),
ı̂n nodurile căreia sunt plasate clădirile (fiecare clădire este modelată printr-un
“bet, is, or” de grosime neglijabilă a cărui ı̂nălt, ime este egală cu ı̂nălt, imea clădirii
din acel punct). Camera de luat vederi urmează să fie instalată la nivelul solului
ı̂n colt, ul stânga-sus (NORD-VEST) al oras, ului (punctul de coordonate (0, 0),
unde nu se găses, te nicio clădire) s, i se presupune că se poate roti complet ı̂n orice
plan relativ la pozit, ia ı̂n care a fost instalată.
O cameră de luat vederi poate supraveghea clădiri doar dacă le poate identifica
part, ial sau integral. De exemplu, considerând un oras, de dimensiune 3×3, ı̂n care
ı̂nălt, imile clădirilor sunt cele marcate ı̂n Figura 2.1, camera de luat vederi situată
la nivelul solului va putea identifica pe direct, ia SUD ambele clădiri (de ı̂nălt, ime
1 s, i 3), pe direct, ia EST va putea identifica doar clădirea de ı̂nălt, ime 3, iar pe
direct, ia SUD-EST va vedea doar clădirea de ı̂nălt, ime 2 situată pe diagonală.
Un alt exemplu de clădiri vizibile pe o direct, ie dată este ilustrat ı̂n Figura 2.2
(clădirile marcate cu linie continuă sunt vizibile, cela marcate cu linie ı̂ntreruptă
sunt invizibile).

(a) (15p) Scriet, i o funct, ie (denumită viewSoutEast care primes, te ca parametri


o matrice O ce cont, ine ı̂nălt, imile clădirilor s, i returnează numărul de clădiri
care pot fi supravegheate pe direct, iile EST, SUD s, i SUD-EST de către
camera plasată ı̂n colt, ul (0, 0) la nivelul solului.
(b) (5p) Se consideră o cameră de luat vederi care poate identifica clădiri ı̂ntr-o
direct, ie arbitrară (definită de pozit, ia camerei (0, 0) s, i o pozit, ie specificată
(k1 , k2 ) - corespunzătoare primei clădiri pe această direct, ie). Scriet, i for-
mula generală a pozit, iei clădirilor aflate pe direct, ia determinată de (0, 0) s, i
(k1 , k2 ).

38
Figura 2.1 Figura 2.2

(c) (5p) Folosind funct, ia viewSouthEast s, i presupunând că este definită funct, ia
viewDir (care are ca parametri matricea O, valorile k1 , k2 s, i returnează
numărul de clădiri vizibile pe direct, ia definită de (k1 , k2 )), descriet, i funct, ia
viewAll care returnează numărul total de clădiri care pot fi supravegheate
atunci când camera este instalată ı̂n (0, 0) la nivelul solului.

3. (15p) Fie P o permutare a numerelor de la 1 la n (n ∈ N). Notăm cu SU S(P )


numărul minim de subs, iruri crescătoare (elementele dintr-un subs, ir nu sunt
neapărat consecutive ı̂n permutarea init, ială) ı̂n care poate fi descompusă P.
Notăm, de asemenea, cu LDS(P ) lungimea celui mai lung subs, ir descrescător al
lui P.
Exemplu: Fie P = {31254}. Atunci SU S(P ) = 2, pentru că P nu e un s, ir
crescător (prin urmare, SU S(P ) > 1), dar putem descompune P ı̂n P1 = (35)
s, i P2 = (124). De aemenea, LDS(P ) = 2, pentru că P are subs, irul descrescător
(32) (de lungime 2), dar P nu are subs, iruri descrescătoare de lungime 3.

(a) (3p) Să se argumenteze că pentru orice permutare P, are loc SU S(P ) ≥
LDS(P ).
(b) (10p) Scriet, i un subprogram care construies, te o descompunere a unei per-
mutări P ı̂ntr-un număr minim de subs, iruri crescătoare.
(c) (2) Demonstrat, i, folosind rezultatul de la punctul (a), că subprogramul
descris la punctul (b) realizează descompunerea lui P ı̂ntr-un număr minim
de subs, iruri crescătoare.

Notă:

1. Limbajul de programare este la alegere ı̂ntre C/C++ s, i Pascal.

2. Pentru fiecare dintre subprogramele (funct, ii, proceduri) scrise se vor specifica
toate declarat, iile de variabile globale s, i locale necesare s, i se vor pune comentarii
explicative. NU este necesară scrierea programului principal s, i nici preluarea
datelor prin citire.

39
BAREM
Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
Problema 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50 pct.
1a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
1(a)i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declarat, ii variabile locale/globale, definire corectă subprogram (inclusiv lista
de parametri) - 1p; algoritm corect de extragere a cifrelor - 2p; algoritm corect de
construire a tabloului c care indică corect cifrele comune - 2p)
1(a)ii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declarat, ii variabile locale/globale, definire corectă subprogram (inclusiv lista
de parametri) - 1p; algoritm corect de extragere a cifrelor - 2p; algoritm corect de
parcurgere a elementelor tabloului c - 2p; algoritm corect de construire a numărului z
- 2p)
1b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
1(b)i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(lungimea laturii este d = cmmd(m, n); numărul minim de tăieturi este m/d−1
(pe verticală), respectiv n/d − 1 (pe orizontală))
1(b)ii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 pct.
(declarat, ii variabile locale/globale, definire corectă subprogram (inclusiv lista
de parametri) - 1p; algoritm corect de calcul a celui mai mare divizor comun - 3p;
algoritm corect de calcul a numărului de tăieturi s, i afis, area rezultatelor - 1p)
1c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
1(c)i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 pct.
A. 12; B. 12; C. a ∗ b
1(c)ii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 pct.
(definire corectă a funct, iei (inclusiv lista de parametri s, i returnare rezultat) -
1p; implementare corectă a funct, iei recursive - 2p)
1d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declarat, ii variabile locale/globale, definire corectă subprogram (inclusiv lista
de parametri) - 1p; parcurgere corectă a matricii s, i determinarea numărului maxim
de prieteni (suma maximă pe linie sau coloană) - 2p; determinarea corectă s, i afis, area
indicilor de linie (coloană) pentru care suma este maximă - 2p)
1e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
1(e)i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 pct.
(Răspuns corect: C.)
1(e)ii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 pct.
(Dacă m = 1 atunci este o singură posibilitate (o piesă de forma 2 × 1).
Dacă ultima piesă completată este de forma 2 × 1 atunci sunt V (m − 1) variante de

40
a completa primele m − 1 coloane. Dacă ultima piesă completată este de forma 1 × 2
atunci penultima trebuie să fie de aceeas, i formă s, i sunt V (m−2) variante de a completa
primele m − 2 coloane. Deci dacă m > 2 are loc V (m) = V (m − 1) + V (m − 2).)
1f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 pct.
1(f)i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 pct.
(declarat, ii variabile locale/globale, definire corectă subprogram (inclusiv lista
de parametri) - 1p; implementarea corectă a unui algoritm de sortare simultană a
tablourilor x s, i y (cu proprietatea că y[i]/x[i] ≤ y[i + 1]/x[i + 1] - 6p)
1(f)ii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 pct.
(declarat, ii variabile locale/globale, definire corectă subprogram (inclusiv lista
de parametri s, i returnarea rezultatului) - 1p; parcurgerea tablourilor sortate s, i con-
torizarea corectă a numărului de linii (de exemplu, contorizând numărul de elemente
(x[i], y[i]) cu proprietatea că y[i] ∗ x[i + 1] 6= y[i + 1] ∗ x[i] s, i adăugând 1) - 7p)
Problema 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25 pct.
2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 pct.
(declarat, ii variabile locale/globale, definire corectă subprogram (inclusiv lista
de parametri) - 1p; algoritm corect de contorizare a clădirilor - 8p; implementarea
corectă a parcurgerii clădirilor pe direct, iile SUD, EST, SUD-EST - 6p)
Idee de contorizare a numărului de clădiri vizibile pe o direct, ie dată (folosind
proprietăt, i referitoare la asemănarea triungiurilor):

Pas 1. se pornes, te de la prima clădire pe direct, ia dată: m ← 1;


Pas 2. se parcurg clădirile k, până la prima clădire pentru care hk /dk > hm /dm (sau
până când s-au parcurs toate clădirile), unde hi = ı̂nălt, ime clădire, iar di este
distant, a de la clădirea i la punctul unde se află camera (ı̂ntrucât clădirile sunt la
distant, e egale este suficient să se considere di = i; fiecare clădire k pentru care
hk /dk < hm /dm se contorizează ca fiind vizibilă.
Pas 3. dacă există o clădire k cu proprietatea hk /dk > hm /dm atunci m ← k (această
clădire devine referint, ă ı̂n raportul de asemănare) s, i se reia de la Pas 2.

2b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(Regula de calcul a pozit, iei clădirii i pe direct, ia definită de (0, 0) s, i (k1 , k2 )
este: (k1 ∗ i, k2 ∗ i) - 5p)
2c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declarat, ii variabile locale/globale, definire corectă subprogram (inclusiv lista
de parametri) - 1p; algoritm corect de contorizare s, i apeluri corecte ale funct, iilor
viewSouthEast, viewDir - 4p)
Problema 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15 pct.
3a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 pct.
(Idee: Fie Q un subs, ir descrescător al lui P de lungime LDS(P ). În orice
descompunere a lui P ı̂n subs, iruri crescătoare, termenii din Q trebuie să apară ı̂n
subs, iruri diferite. Prin urmare, SU S(P ) ≥ LDS(P ).)

41
3b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declarat, ii variabile locale/globale, definire corectă subprogram (inclusiv lista
de parametri) - 1p; parcurgere corectă a elementelor permutării - 1p; algoritm corect
de construire a subs, irurilor - 6p; completare corectă a subs, irurilor ı̂n structura de date
pentru care s-a optat (matrice, liste etc.) - 2p)
Idee: se poate aplica o strategie de tip “greedy”: se parcurg elementele per-
mutării s, i se adaugă fiecare la primul subs, ir compatibil (ı̂n care ultimul element adăugat
este mai mic decât elementul curent), init, iind un nou subs, ir dacă adăugarea la unul
existent nu este posibilă.
3c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 pct.
(Fie m numărul de subs, iruri construite folosind algoritmul de la punctul (b).
Vom demonstra că m ≤ LDS(P ) (corectitudinea rezultând din proprietatea de la
punctul (a) s, i această observat, ie). Pentru aceasta e suficient să creăm un subs, ir des-
crescător care cont, ine un element din fiecare subs, ir creat folosind algoritmul “greedy”
de la punctul (b). Să considerăm ultimul element xm adăugat ı̂n ultimul subs, ir Sm .
xm a fost adăugat ı̂n Sm (s, i nu ı̂n Sm−1 pentru că a existat un element xm−1 > xm ı̂n
Sm−1 la momentul ı̂n care l-am adăugat pe xm (xm−1 “nu a permis” adăugarea lui xm
ı̂n subs, irul Sm−1 ). Pe de altă parte, xm−1 este ı̂n Sm−1 pentru că există xm−2 ı̂n Sm−2 ,
cu xm−2 > xm−1 care “nu a permis” ca xm−1 să fie adăugat ı̂n subs, irul Sm−2 s, .a.m.d.
În acest fel, am construit un s, ir descrescător x1 > x2 > · · · > xm , xi ∈ Si .)

42
2.4 Edit, ia a VI-a (2021)
1. Se consideră funct, ia T descrisă mai jos care primes, te un parametru ı̂ntreg s, i
returnează o valoare ı̂ntreagă (operatorii DIV s, i MOD specifică câtul, respectiv
restul ı̂mpărt, irii ı̂ntregi).
funct, ie T(n)
dacă n=1 atunci returnează 1 sf dacă
S←0
m ← n DIV 2
dacă n M OD 2 = 0 atunci
m←m−1
sf dacă
i←1
at timp i <= m execută
c^
S ← S + T (i) ∗ T (n − i)
i←i+1
sf c^
at timp
dacă n M OD 2 = 0 atunci
x ← T (n/2)
returnează 2 ∗ S + x ∗ x
altfel
returnează 2 ∗ S
sf dacă
sf funct, ie
Ce valoare va returna funct, ia dacă este apelată pentru n = 5?

(a) 61
(b) 23
(c) 12
(d) 14 Răspuns corect
(e) 15

2. Se consideră următoarea secvent, ă de prelucrări prin care se completează elemen-


tele unui tablou a:
pentru i ← 1, 200 execută
a[i] ← i ∗ i − i
sf pentru
Câte dintre elementele tabloului a au cifra unităt, ilor egală cu 0?

(a) 20

43
(b) 21
(c) 79
(d) 80 Răspuns corect
(e) 81
(f) 82

Indicat, ie: Se determină câte numere sunt multiplu de 5 de la 1 la 200 s, i de la


0 zero 199.
3. Pentru decorarea cu pitici artizanali a unei grădini avem la dispozit, ie 130 de lei.
S, tiind că un pitic mare costă 50 lei, un pitic mijlociu costă 25 lei s, i un pitic mic
costă 10 lei, câte variante de decorare pot fi identificate astfel ı̂ncât să nu rămână
mai mult de 9 lei neutilizat, i?

(a) 12 Răspuns corect


(b) 10
(c) 13
(d) 5

Indicat, ie: Se poate construi arborele de parcurgere a spat, iului solut, iilor pornind
de la nodul cu suma totală s, i ramificând prima dată după pitici mari (pot fi 2, 1
sau 0), dupa aceea pentru pitici medii (de restul banilor se cumpără pitici mici
ca sa nu rămână rest mai mare ca 9):
ˆ 2 mari → 1 sau 0 medii (2 variante)
ˆ 1 mare → 3, 2, 1, 0 medii (4 variante)
ˆ 0 mari → 5, 4, 3, 2, 1, 0 medii (6 variante)
În total 12 variante.
4. Câte zerouri are la sfârs, it 2021! (factorialul numărului 2021)?
(a) 202
(b) 420
(c) 500
(d) 501
(e) 503 Răspuns corect
Indicat, ie: Se vor număra numerele până la 2021 care sunt multipli de 5. Fiecare
multiplu de 5 va adăuga un 0. Fiecare multiplu de 52 va adăuga câte un 0 ı̂n plus
pentru că a fost deja numărat ca s, i multiplu de 5. Se va continua cu multiplii
lui 53 , apoi 54 .
2021 / 5 = 404
2021 / 25 = 80
2021 / 125 = 16
2021 / 625 = 3
total = 503

44
5. Se consideră secvent, a de instruct, iuni care transformă un tablou x ce cont, ine n
valori reale:
pentru i ← 1, n − 1 execută
dacă x[i] > x[i + 1] atunci
aux ← x[i]
x[i] ← x[i + 1]
x[i + 1] ← aux
sf dacă
sf pentru
Care dintre următoarele proprietăt, i este satisfacută de către elementele tabloului
x după execut, ia secvent, ei de mai sus?

(a) x[n] ≤ x[i] pentru orice i ∈ {1, 2, . . . , n}


(b) x[n] ≥ x[i] pentru orice i ∈ {1, 2, . . . , n} Răspuns corect
(c) x[i] ≤ x[i + 1] pentru orice i ∈ {1, 2, . . . , n − 1}
(d) x[i] ≥ x[i + 1] pentru orice i ∈ {1, 2, . . . , n − 1}
(e) x[1] ≤ x[i] pentru orice i ∈ {1, 2, . . . , n}
(f) x[1] ≥ x[i] pentru orice i ∈ {1, 2, . . . , n}

Indicat, ie: Prin interschimbarea elementelor vecine, valoarea maximă va fi pla-


sată pe ultima pozit, ie.

6. Se consideră un text stocat ı̂ntr-un s, ir de caractere, s, cu n elemente indexate


ı̂ncepând cu 1. Se pune problema transformării s, irului de caractere prin elimina-
rea spat, iilor multiple (de exemplu s, irul de caractere ”un sir” este transformat
ı̂n ”un sir”).
i←1
at timp i < n execută
c^
k←0
at timp s[i] =0
c^ 0
execută k ← k + 1; i ← i + 1; sf c^
at timp
dacă k > 1 atunci
h fragment pseudocod i
n←n−k+1
i←i−k
sf dacă
i←i+1
sf c^
at timp
Care dintre fragmentele de cod asigură eliminarea spat, iilor adit, ionale?

45
(a) Răspuns corect
j←i
at timp j <= n execută
c^
s[j − k + 1] ← s[j]
j ←j+1
sf c^at timp
(b) Răspuns corect
j←i
h←i−k+1
at timp j <= n execută
c^
s[h] ← s[j]
j ←j+1
h←h+1
sf cat timp
(c) j ← i
at timp j <= n execută
c^
s[j − k] ← s[j]
j ←j+1
sf c^
at timp
(d) Niciuna din variantele propuse nu este corectă

7. Se consideră o secvent, ă de n valori naturale stocate ı̂ntr-un tablou x cu elemente


indexate ı̂ncepând cu 1. În ipoteza că secvent, a cont, ine exact o valoare egală cu 0
se dores, te transformarea tabloului prin permutare circulară ı̂nspre stânga, astfel
ı̂ncât valoarea 0 să ajungă pe prima pozit, ie (de exemplu secvent, a (2, 1, 3, 0, 5, 4)
este transformată ı̂n (0, 5, 4, 2, 1, 3)):
i←1
at timp x[?a] 6= 0 execută
c^
aux ←?b
pentru i ← 2, n execută
x[?c] ← x[?d]
sf pentru
x[?e] ← aux
sf c^
at timp
Care dintre următoarele variante de completare a pseudocodului de mai sus
asigură cerint, a problemei?

(a) ?a → 1, ?b → x[1], ?c → i − 1, ?d → i, ?e → n Răspuns corect


(b) ?a → i, ?b → x[1], ?c → i − 1, ?d → i, ?e → n
(c) ?a → 1, ?b → x[i], ?c → i − 1, ?d → i, ?e → n
(d) ?a → n, ?b → x[n], ?c → i, ?d → i − 1, ?e → 1

46
(e) Niciuna din variante nu este corectă.

8. Pentru care din următoarele apeluri funct, ia F va returna valoarea 1?


Varianta C
int F(int n, int x)
if (n<2) return 1;
else if (n % 2 == 0)
return F(n/x,x+1);
else return 0;
Varianta Pascal
function F(n,x:integer):integer;
begin
if (n<2) then F := 1
else if (n MOD x=0) then
F := F(n DIV x, x+1)
else
F := 0;
end;

(a) F (5040, 2) Răspuns corect


(b) F (24, 2) Răspuns corect
(c) F (25, 2)
(d) F (36, 2)

9. Ce valoare va avea variabila k ı̂n urma execut, iei secvent, ei de prelucrări pentru
un număr natural nenul n (operatorul DIV produce câtul ı̂mpărt, irii ı̂ntregi, iar
[x] reprezintă partea ı̂ntreaga a numărului x)?
k←0
at timp n > 0 execută
c^
n ← n/2
k ←k+1
sf c^
at timp

(a) n/2
(b) [log2 n]
(c) n
(d) [log2 n] + 1 Răspuns corect

47
10. Se consideră matricea
 
1 1
A=
1 0

Care este valoarea elementului de pe prima linie, prima coloană (elementul din
stânga sus) din matricea A100 = A ∗ A ∗ . . . ∗ A (de 100 de ori)

(a) 100
(b) 1
(c) elementul cu indicele 100 din s, irul dat prin relat, ia de recurentă: f0 = 1, f1
= 1, fn = fn−1 + fn−2 Răspuns corect
(d) elementul cu indicele 99 din s, irul dat prin relat, ia de recurentă: f0 = 1, f1
= 1, fn = fn−1 + fn−2
(e) 2100

11. Se consideră funct, ia recursivă:


funct, ie F (a)
dacă a <= 3
returneaza 1
altfel
returneaza F (a − 1) + F (a − 2) + F (a − 3)
sf daca
sf functie
De câte ori se calculează F(4) dacă primul apel este F(10)?

(a) 25
(b) 24 Răspuns corect
(c) 28
(d) 15

12. Ce va afis, a subprogramul de mai jos ı̂n cazul apelului F(27)?


subprogram F (n)
dacă n <= 0 atunci afis, are(0)
altfel
afis, are( n )
F (n − 5)
afis, are( n )
sf dacă
sf subprogram

48
(a) 0 2 7 12 17 22 27
(b) 27 22 17 12 7 2 0 2 7 12 17 22 27 Răspuns corect
(c) 27 22 17 12 7 2 -2 2 7 12 17 22 27
(d) 25 20 15 10 5 0 5 10 15 20 25
(e) 27 22 17 12 7 2 0

13. Se consideră un număr natural n constituit din k + 1 cifre (n = ck ck−1 . . . c1 c0 ).


Care sunt cifrele numărului m construit prin secvent, a de prelucrări de mai jos
ı̂n ipoteza că k=3? (operatorii DIV s, i MOD permit calculul câtului respectiv
restului ı̂mpărt, irii ı̂n domeniul numerelor ı̂ntregi)
p←1
m ← n M OD 10
n ← n DIV 10
q←1
at timp n 6= 0 execută
c^
q ←q+1
pentru i ← 1, q execută
p ← p ∗ 10
sf pentru
m ← (n M OD 10) ∗ p + m
n ← n DIV 10
sf c^
at timp

(a) c0 0c1 0c2 0c3


(b) c3 0c2 0c1 0c0
(c) c3 00c2 0c1 c0
(d) c3 000c2 00c1 0c0 Răspuns corect
(e) c0 000c1 00c2 0c3

14. De câte ori se execută instruct, iunea x ← x + 1 ı̂n secvent, a de mai jos?
x←0
pentru i ← 2, N execută
pentru j ← 1, i − 1 execută
x←x+1
sf pentru
sf pentru

(a) N (N − 1)
(b) N (N − 1)/2 Răspuns corect

49
(c) N (N + 1)/2
(d) (N − 1)(i − 1)

Indicat, ie: Numărul


P de execut, iiPale liniei x ← x + 1 este dat de calculul
N −1
următoarei sume N
Pi−1
i=2 j=1 1 = i=1 i.

15. Se consideră un tabloul t cu n elemente indexate ı̂ncepând cu 1 s, i următoarea


secvent, ă de prelucrări aplicate asupra elementelor tabloului:
i←1
j←n
at timp i < j execută
c^
at timp (t[i] > 0 si i <= n) execută i ← i + 1 sf c^
c^ at timp
at timp (t[j] < 0 si j >= 1) execută j ← j − 1 sf c^
c^ at timp
dacă i < j atunci
aux ← t[i]
t[i] ← t[j]
t[j] ← aux
sf dacă
sf c^
at timp
Ce efect are secvent, a de prelucrări asupra tabloului t?

(a) Ordonează crescător tabloul t


(b) Plasează elementele pozitive ı̂n prima parte a tabloului t Răspuns corect
(c) Nu se poate spune nimic despre structura tabloului t
(d) Ordonează decrescător tabloul t
(e) Plasează elementele negative ı̂n prima parte a tabloului t

Problema 1
Se consideră un dreptunghi de dimensiune 2 × n (două linii s, i n coloane) s, i se dores, te
acoperirea dreptunghiului cu piese de domino de forma 2 × 1 sau 1 × 2.

1. Propunet, i o funct, ie care determină numărul de modalităt, i de acoperire exactă


a dreptunghiului cu piese (nu pot să rămână port, iuni neacoperite iar piesele nu
pot depăs, i conturul dreptunghiului).
2. În ipoteza că două dintre celulele dreptunghiului aflate in colt, uri opuse sunt
inaccesibile (de exemplu celula (1, 1) s, i celula (2, n) sau celule (2, 1) s, i celula
(1, n)), propunet, i o funct, ie care determină numărul de modalităt, i de acoperire
exactă a dreptunghiului cu piese (exceptând celulele din cele două colt, uri).

Prezentat, i pe scurt ideea de rezolvare s, i descriet, i solut, ia ı̂n pseudocod sau ı̂ntr-un
limbaj de programare la alegere (C/C++, Pascal, Python).

50
Idee de rezolvare
1. Considerând dreptunghiul de dimensiune n se poate ı̂ncepe acoperirea fie cu:
1 - o piesă plasată vertical, caz ı̂n care problema se reduce la o problemă de
dimensiune n − 1
2 - două piese plasate orizontal, caz ı̂n care problema se reduce la o problemă de
dimensiune n − 2
Prin urmare formula de calcul a numărului de variante posibile este:
C(1) = 1
C(2) = 2 (se pot pune orizontal sau vertical)
C(n) = C(n-1) + C(n-2) (de tip Fibonacci)

2. Se analizează paritatea lui n, dacă n este par nu există varianta de acoperire


fără să se suprapună piesele. Dacă n este impar există o singura posibilitate de
acoperire cu piese plasate orizontal (nu se poate pune nicio piesă verticală).

BAREM
Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 pct.
(a) Descrierea ideii de rezolvare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 pct.
Implementarea funct, iei:
Declarat, ii de variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 pct.
Implementare corectă C(1) = 1, C(2) = 2, C(n) = C(n − 1) + C(n − 2) 2 pct.
Definirea corectă a funct, iei s, i returnarea rezultatului . . . . . . . . . . . . . . . . . . 1 pct.
(b) Descrierea ideii de rezolvare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 pct.
Declarat, ii, definire s, i implementare corectă a subprogramului . . . . . . . . . . . . . .1 pct.

Problema 2
Se consideră două secvent, e de câte n valori naturale a1 , a2 , . . ., an respectiv b1 , b2 , . . .,
bn . Se pune problema determinării unei permutări de ordin n, p = (p(1), p(2), . . . , p(n))
astfel ı̂ncât suma |a1 −bp(1) |+|a2 −bp(2) |+. . .+|an −bp(n) | să fie cât mai mare. Descriet, i
un algoritm care permite obt, inerea permutării s, i sumei corespunzătoare.
De exemplu, pentru a = (5, 9, 12, 4) s, i b = (7, 2, 15, 5) o permutare care satisface
cerint, a este p = (1, 4, 2, 3), suma fiind |5 − 7| + |9 − 5| + |12 − 2| + |4 − 15| = 27.

Prezentat, i pe scurt ideea de rezolvare, justificat, i că ideea este corectă s, i descriet, i
solut, ia ı̂n pseudocod sau ı̂ntr-un limbaj de programare la alegere (C/C++, Pascal,
Python).

51
Idei de rezolvare
Varianta 1: Pentru construirea permutării se parcurg elementele lui a ı̂n ordine des-
crescătoare s, i a lui b ı̂n ordine crescătoare. La primul pas se va completa ı̂n permutare
p[pozmaxa ] = pozminb s, i se continua procesul.

Varianta 2: Generarea tuturor permutărilor s, i selectarea celei de sumă maximă (va-


rianta aceasta este ineficientă).

BAREM
Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 pct.
Idee rezolvare - specificare modului de obt, ine al permutării . . . . . . . . . . . . . . . . . . . 2 pct.
Argumentarea corectitudinii algoritmului propus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 pct.
Declarat, ii de variabile care descriu structurile utilizate . . . . . . . . . . . . . . . . . . . . . . . .1 pct.
Construirea corectă a permutarii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 pct.
Calculul corect al sumei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 pct.

Problema 3
Pentru un grup de n persoane se cunosc perechile de persoane care intră frecvent ı̂n
contact (fac parte din aceeas, i familie sau lucrează ı̂mpreună). În contextul răspândirii
unei epidemii se consideră că toate persoanele care au intrat ı̂n contact cu o persoană
infectată devin infectate. Cunoscând care este pacientul 0 determinat, i numărul de
persoane care au fost infectate.
Exemplu: n = 7 s, i perechile de persoane care intră ı̂n contact sunt: (P1 , P2 ),
(P1 , P4 ), (P1 , P7 ), (P3 , P6 ) s, i (P5 , P6 ). În ipoteza că pacientul zero este P2 modul de
răspândire al infect, ie este: la etapa 1 se infectează P1 , la etapa 2 se infectează P4
s, i P7 s, i procesul de răspândire a infect, iei se opres, te deoarece nu mai există persoane
neinfectate care au intrat ı̂n contact cu o persoană infectată, numărul de persoane
infectate fiind 4.

Prezentat, i pe scurt ideea de rezolvare s, i descriet, i solut, ia ı̂n pseudocod sau ı̂ntr-un
limbaj de programare la alegere (C/C++, Pascal, Python).

Idei de rezolvare
Varianta 1: Relat, iile dintre persoane se pot reprezenta sub forma unui graf, iar
numărul de noduri (determinat prin parcurgere ı̂n adancime sau ı̂n lăt, ime) din sub-
graful care cont, ine persoana zero reprezintă solut, ia problemei.

52
Varianta 2: Pentru a reprezenta contactele se poate folosi o matrice (m), mi,j = 1
dacă persoana i a intrat ı̂n contact cu persoana j. Pentru a determina numărul de
persoane infectate se poate folosi un vector (v) care stochează informat, ia dacă persoana
este infectată sau nu. Se pornes, te de la persoana zero (p0 ) s, i se caută persoanele cu
care este ı̂n contact mp0 ,k = 1, k = 1, n. În prima etapă se marchează ca infectate toate
persoanele aflate ı̂n contact direct cu pacientul p0 . La etapa următoare se marchează
ca infectate toate persoanele neinfectate care sunt ı̂n contact direct cu cele infectate la
etapa anterioară. Procesul va continua până când nu mai apar persoane nou infectate.

BAREM
Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 pct.
Idee rezolvare - descrierea procesului de răspândire a infect, iei . . . . . . . . . . . . . . . . . 2 pct.
Descrierea structurilor de date folosite s, i declarat, ii . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 pct.
Implementarea algoritmului de răspândire a infect, iei . . . . . . . . . . . . . . . . . . . . . . . . . . 4 pct.
Determinarea corectă a numărului de persoane infectate . . . . . . . . . . . . . . . . . . . . . . 1 pct.

53
Capitolul 3

Subiecte date la examenul de


admitere la facultate

3.1 Sesiunea Iulie 2016


1. (a) (5p) Scriet, i o funct, ie C/C++/Pascal care primes, te ca parametru o valoare
naturală n din mult, imea {0, . . . , 255} s, i returnează valoarea m calculată
după regula:
(
n/2 dacă n este par
m=
128+(n-1)/2 dacă n este impar

(b) (5p) Se consideră un pătrat de latură L al cărui vârf din stânga jos are coor-
donatele (x0 , y0 ). Se pune problema verificării dacă un punct de coordonate
(x, y) se află sau nu ı̂n interiorul pătratului. Scriet, i o funct, ie C/C++/Pascal
care primes, te ca parametri de intrare valorile reale L, x0 , y0 , x, y s, i retur-
nează 1 dacă punctul se află ı̂n interiorul pătratului s, i 0 ı̂n caz contrar.
(c) (5p) Scriet, i o funct, ie C/C++/Pascal care primes, te 6 parametri (a, b, c, x, y,
z) care reprezintă lungimile laturilor a două triunghiuri (a, b, c reprezintă
lungimile laturilor primului triunghi, iar x, y, z lungimile laturilor celui de
al doilea triunghi) s, i returnează 1 dacă triunghiurile sunt asemenea s, i 0 ı̂n
caz contrar. Lungimile laturilor fiecărui triunghi sunt numere naturale s, i
sunt enumerate ı̂ntr-o ordine arbitrară.
(d) (5p) Se consideră o tablă caroiată ce cont, ine N × N (N > 3) pătrăt, ele din
care se elimină două pătrăt, ele aflate ı̂n extremităt, ile uneia dintre diagonale.
Se dores, te acoperirea tablei cu piese de domino de dimensiune 2 × 1 (care
pot fi plasate pe orizontală sau verticală).
Când este posibilă acoperirea exactă a tablei cu piese?
i. când N este impar;
ii. când N este par;
iii. pentru nicio valoare a lui N ;
iv. pentru orice valoare a lui N.

54
2. Adresele de e-mail de la UVT au următoarea structură: prenume.nume@e-uvt.ro
(numele s, i prenumele cont, in doar litere mici).

(a) (10p) Scriet, i o funct, ie C/C++/Pascal care primes, te ca parametru un s, ir


de caractere ce cont, ine simbolul @ s, i returnează 1 dacă s, irul reprezintă o
adresă de e-mail care respectă structura de la UVT s, i 0 ı̂n caz contrar.
(b) (10p) Scriet, i o funct, ie (procedură) C/C++/Pascal care primes, te ca pa-
rametru un s, ir de caractere ce reprezintă o adresă de e-mail de la UVT
corectă s, i afis, ează prenumele s, i numele separate de un spat, iu, fiecare dintre
ele ı̂ncepând cu majusculă.
Exemplu: pentru adresa ioan.popescu@e-uvt.ro se va afis, a Ioan Popescu.

3. Doi prieteni, Geo s, i Leo, joacă următorul joc: pe o foaie este scrisă o listă de
M numere naturale nenule mai mici decât 10000. La ı̂nceputul jocului, Geo s, i
Leo aleg fiecare câte trei numere prime impare distincte, mai mici decât 100. La
fiecare rundă se trece la următorul număr din listă, notat cu N, s, i fiecare dintre
cei doi jucători ı̂s, i recalculează scorul după următoarea regulă: se adaugă câte
1 punct pentru fiecare factor din descompunerea ı̂n produs de factori primi a
numărului N care se regăses, te printre cele 3 numere prime pe care le-a ales la
ı̂nceput, se scade câte un punct pentru fiecare dintre numerele sale prime care
nu apare ı̂n descompunerea ı̂n produs de factori primi a numărului N. Câs, tigă
jucătorul care are punctajul cel mai mic la terminarea tuturor numerelor de pe
foaie.
Exemplu: dacă numărul N este 150, iar Geo a ales la ı̂nceput numerele prime
3, 5 s, i 13, va primi un total de 2 puncte: 1 punct pentru 3, 2 puncte pentru 5 s, i
−1 punct pentru 13.
Scriet, i următoarele funct, ii (C/C++/Pascal) utile pentru calculul scorului ununi
jucător:

(a) (5p) estePrim(x) - o funct, ie care returnează 1 dacă x este prim s, i impar,
respectiv 0 ı̂n caz contrar.
(b) (5p) esteFactorPrim(N, x) - o funct, ie care returnează 1 dacă x apare ı̂n
descompunerea ı̂n produs de factori primi a lui N, respectiv 0 ı̂n caz contrar;
se va utiliza funct, ia estePrim descrisă la punctul (a).
(c) (5p) puncte(N, x) - o funct, ie care returnează numărul de puncte primite
pentru perechea (N, x); se va utiliza funct, ia esteFactorPrim descrisă la
punctul (b).
(d) (5p) punctaj(listaNumere, nr1, nr2, nr3) - o funct, ie care returnează
scorul corespunzător listei de numere pentru jucătorul care a ales nume-
rele prime init, iale nr1, nr2 s, i nr3, determinat folosind funct, ii dintre cele
descrise anterior.

4. Se consideră o imagine pe niveluri de gri, A, reprezentată printr-o matrice cu 50


de linii s, i 50 de coloana care cont, ine valori din mult, imea {0, . . . , 255} (valoarea
unui element din matrice reprezintă nivelul de gri al pixelului corespunzător din
imagine).

55
(a) (10p) Scriet, i o funct, ie (procedură) C/C++/Pascal care, pornind de la ma-
tricea A (variabilă globală), construies, te histograma imaginii (un tablou
unidimensional H cu 256 de elemente ı̂n care elementul de pe pozit, ia i
cont, ine numărul de elemente din matricea A care au valoarea i).
(b) (10p) Scriet, i o funct, ie C/C++/Pascal care primes, te ca parametru tabloul
cu histograma imaginii determinată la punctul (a) s, i returnează nivelul
mediu de gri, g, (calculat ca medie ponderată a elementelor din matricea
A : g = (H[0]×0+H[1]×1+· · ·+H[255]×255)/(H[0]+H[1]+· · ·+H[255])).
(c) (10p) Scriet, i o funct, ie (procedură) C/C++/Pascal care primes, te ca para-
metri matricea A s, i nivelul mediu de gri g, determinat la punctul (b), s, i
construies, te o matrice B de aceleas, i dimensiuni cu A cu proprietatea că
elementul de pe linia i s, i coloana j este egal cu 1 dacă elementul cores-
punzător din matricea A este mai mare sau egal cu g, respectiv este egal cu
0 dacă elementul corespunzător din A este mai mic decât g.

BAREM
Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
Problema 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20 pct.
1a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei s, i returnarea rezultatului - 1p; calculul corect al
valorii m - 4p)
1b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei s, i returnarea rezultatului - 1p; specificarea co-
rectă a condit, iei de punct interior (x ∈ (x0 , x0 + L) s, i y ∈ (y0 , y0 + L)) - 4p)
1c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei s, i returnarea rezultatului - 1p; verificarea corectă
a condit, iei de asemănare a triunghiurilor (se transformă variabilele astfel ı̂ncât a ≤
b ≤ c s, i x ≤ y ≤ z după care se verifică condit, ia de proport, ionalitate a lungimilor
laturilor: a/x = b/y = c/z sau a × y = b × x s, i b × z = c × y) - 4p)
1d (iii) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
Problema 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20 pct.
2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea corectă a funct, iei s, i returnarea rezultatului - 1p; verificarea corectă
a structurii de adresă UVT (subs, irurile ce corespund prenumelui s, i numelui sunt nevide
s, i cont, in doar litere mici - 2p, există un singur punct ı̂nainte de simbolul @ - 2p, iar
subs, irul de după simbolul @ coincide cu “e-uvt.ro” - 5p))
2b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea corectă a funct, iei (procedurii)- 1p; afis, area prenumelui - 4p s, i
numelui - 4p ı̂ncepând cu majuscule - 1p)
Problema 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20 pct.

56
3a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei s, i returnarea rezultatului - 1p; verificarea corectă
a proprietăt, ii de număr impar - 1p s, i de număr prim - 3p)
3b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei s, i returnarea rezultatului - 1p; verificarea corectă
a faptului că x este factor prim al lui N - 4p)
3c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei s, i returnarea rezultatului - 1p; calculul corect al
numărului de puncte - 4p)
3d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei s, i returnarea rezultatului - 1p; calculul corect al
scorului: parcurgerea listei cu numere - 2p, apelul corect al funct, iei punctaj - 2p)
Problema 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 pct.
4a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea corectă a matricii A - 1p; declararea corectă a tabloului H - 1p;
declararea corectă a funct, iei (procedurii) - 1p; completarea corectă a tabloului H - 7p)
4b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea corectă a funct, iei s, i returnarea rezultatului - 1p; calculul corect al
mediei ponderate - 9p)
4c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea corectă a matricii B - 1p; declararea corectă a funct, iei (procedurii)
- 1p; construirea corectă a matricii B - 8p)

57
3.2 Sesiunea Iulie 2017
1. (10p) O matrice pătratică se consideră matrice de tip X dacă toate elementele
sale sunt nule cu except, ia celor care se află pe una dintre cele două diagonale.

(a) (5p) Pentru o matrice pătratică A de dimensiune n (n ≤ 10) se consideră


următorul algoritm al cărui scop este să verifice dacă A este matrice de tip
X:
corect ← 1
pentru i ← 1, n execută
pentru j ← 1, n execută
dacă < . . . condit, ie referitoare la A, i s, i j · · · >
atunci corect ← 0
Completat, i condit, ia (< . . . condit, ie referitoare la A, i s, i j · · · >)
din pseudocod astfel ı̂ncât variabila corect să aibă valoarea 1 dacă matricea
este de tip X s, i valoarea 0 altfel.
(b) (5p) Scriet, i o funct, ie C/C++/Pascal care implementează algoritmul de la
punctul (a) s, i returnează valoarea variabilei corect.

2. (10p) Se consideră următoarea relat, ie de recurent, ă (pentru n s, i k numere natu-


rale):

0
 dacă n < k sau n = 0
f (n, k) = 1 dacă n > 0 s, i (n = k sau k = 0)

f(n-1,k)+f(n-1,k-1) dacă n > 0 si k < n
,

(a) (2p) Ce valoare are f (4, 2)?


(b) (3p) Ce calcul descrie relat, ia de recurent, ă (pentru 1 ≤ k ≤ n)? Aleget, i
raspunsul corect dintre:
Pn−1 Pn−1
i. i=k i + i=k−1 i;
ii. Cnk ;
iii. 2 n−1
P Pk−1 Pk
i=1 i + i=1 i + i=1 i;
k
iv. An
(c) (5p) Scriet, i o funct, ie recursivă ı̂n C/C++/Pascal care implementează re-
lat, ia de recurent, ă (primes, te parametrii n s, i k s, i returnează valoarea lui
f (n, k)).

3. (35p) Se consideră o secvent, ă cu k (k ≤ 1000) numere naturale stocată ı̂ntr-un


tablou unidimensional S.

(a) (10p) Scriet, i o funct, ie C/C++/Pascal care primes, te ca parametri pe k s, i S


s, i efectuează următoarele prelucrări:
i. completează o variabilă globală L (tablou unidimensional) care cont, ine
numărul de elemente din fiecare subsecvent, ă cu valori de aceeas, i pari-
tate;

58
ii. returnează numărul N de subsecvent, e identificate
Exemplu: Pentru secvent, a (5, 1, 3, 2, 4, 7, 6, 4, 10, 8, 3) tabloul L va con-
t, ine valorile (3, 2, 1, 4, 1), iar funct, ia va returna 5.
(b) (10p) Scriet, i un subprogram C/C++/Pascal care primes, te ca parametri
indicii, i1 s, i i2 (se presupune că i1 ≤ i2 , a două elemente din S s, i ordonează
crescător subtabloul din tabloul S (considerat variabilă globală) determinat
de cei doi indici.
Exemplu: În cazul ı̂n care indicii pornesc de la 0, pentru secvent, a (5, 1, 3, 2,
4, 7, 6, 4, 10, 8, 3) s, i i1 = 6, i2 = 9, după ordonare, variabila S va cont, ine
(5, 1, 3, 2, 4, 7, 4, 6, 8, 10, 3).
(c) (10p) Folosind rezultatele obt, inute apelând funct, ia de la punctul (a) s, i
apelând subprogramul de la punctul (b) să se transforme tabloul S ast-
fel ı̂ncât toate subsecvent, ele de numere de aceeas, i paritate să fie ordo-
nate crescător. Secvent, a (5, 1, 3, 2, 4, 7, 6, 4, 10, 8, 3) se va transforma ı̂n
(1, 3, 5, 2, 4, 7, 4, 6, 8, 10, 3).
(d) (5p) Ana s, i Maria joacă următorul joc: fiind dată o secvent, ă de numere
naturale fiecare jucător trebuie să elimine subsecvet, a de numere de aceeas, i
paritate de la ı̂nceputul secvent, ei curente. Pentru secvent, a (5, 1, 3, 2, 4,
7, 6, 4, 10, 8, 3), după mutarea primului jucător, secvent, a devine (2, 4, 7, 6, 4,
10, 8, 3), după mutarea celui de al doilea, devine (7, 6, 4, 10, 8, 3) etc. Ju-
cătorul care elimină ultima subsecvent, ă pierde jocul. Ambele jucătoare au
acces la ı̂ntreaga secvent, ă. Ana are dreptul să decidă dacă vrea să ı̂nceapă
jocul sau dacă o lasă pe Maria să ı̂nceapă. Ce informat, ii despre secvent, a
sunt suficiente pentru Ana pentru a putea lua decizia care garantează că va
câs, tiga? Descriet, i, ı̂n limbaj natural, regula de decizie corespunzătoare.

4. (35p) Un careu Sudoku este un tablou bidimensional cu 9 linii s, i 9 coloane ce


cont, ine cifre cuprinse ı̂ntre 1 s, i 9. Careul este considerat corect completat dacă
satisface următoarele proprietăt, i (vezi exemplul de mai jos):
(i) fiecare linie s, i fiecare coloană cont, ine cifre distincte;
(ii) fiecare dintre cele 9 subtablouri cu 3 linii s, i 3 coloane (care acoperă ı̂n mod
disjunct tabloul de 9 × 9) cont, ine cifre disctincte.

(a) (10p) Scriet, i o funct, ie C/C++/Pascal care primes, te ca parametru un tablou


unidimensional cu 9 elemente s, i verifică dacă elementele sunt cifre distincte
(se presupune că elementele sunt numere naturale ı̂ntre 1 s, i 9). Funct, ia
va returna valoarea 1 dacă tabloul satisface proprietatea cerută s, i 0 ı̂n caz
contrar.
(b) (2p) Declarat, i o variabilă cu numele S ı̂n care să poată fi stocat tabloul
bidimensional cu 9 linii s, i 9 coloane.
(c) (5p) Scriet, i o funct, ie C/C++/Pascal care primes, te ca parametru indicii
corespunzători celulei din stânga sus, respectiv ale celulei din dreapta jos a
unui subtablou de 3 × 3 elemente din tabloul S s, i verifică dacă elementele
subtabloului specificat sunt cifre distincte (se presupune că elementele sunt
numere naturale ı̂ntre 1 s, i 9). Funct, ia va returna valoarea 1 dacă subtabloul
specificat satisface proprietatea cerută s, i 0 ı̂n caz contrar. Este permisă
utilizarea funct, iei de la punctul (a).

59
(d) (15p) Scriet, i un subprogram C/C++/Pascal care foloses, te funct, iile definite
la (a) s, i (c) s, i care verifică dacă tabloul stocat ı̂n variabila globală S cores-
punde unui careu Sudoku completat corect. Subprogramul va afis, a “Careu
corect” dacă sunt satisfăcute proprietăt, ile, respectiv “Careu incorect” dacă
nu sunt satisfăcute.
(e) (3p) Presupunând că ı̂ntr-un subtablou 3 × 3 sunt completate k elemente
(1 < k < 9) cu valori specificate, care este numărul de subtablouri distincte
(care satisfac condit, ia de Sudoku) ce pot fi obt, inute prin completarea celor
9 − k elemente? Aleget, i răspunsul corect dintre:
i. Ak9 ;
ii. A9−k
9 ;
iii. C9k ;
iv. C99−k ;
v. k!;
vi. (9 − k)!.
Exemplu de careu completat corect:

6 8 2 1 9 4 3 5 7
7 3 1 5 6 8 9 2 4
4 9 5 7 2 3 8 6 1
8 2 7 9 3 5 1 4 6
5 1 9 6 4 7 2 8 3
3 6 4 2 8 1 5 7 9
9 5 6 4 1 2 7 3 8
2 4 8 3 7 9 6 1 5
1 7 3 8 5 6 4 9 2
Sursa:
http://www.rasfoiesc.com/familie/copii/Ghid-Sudoku-Regulile-jocului69.php

60
BAREM
Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
Problema 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 pct.
1a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(Condit, ia ((i = j sau i + j = n + 1) s, i Aij = 0) sau (i 6= j s, i i + j 6= n +
1 s, i Aij 6= 0))
1b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei, a variabilelor locale s, i returnarea rezultatului
- 1p; descrierea corectă a parcurgerii matricii - 2p; specificarea corectă a condit, iei s, i
completarea variabilei corect - 1p)
Problema 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 pct.
2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 pct.
Răspuns corect: 6
2b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 pct.
Răspuns corect: ii.
2c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei, a variabilelor locale s, i returnarea rezultatului -
1p;implementarea corectă a relat, iei de recurent, ă - 4p)
Problema 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35 pct.
3a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea corectă a funct, iei s, i a variabilelor locale - 2p; completarea corectă
a tabloului L - 6p; determinarea s, i returnarea numărului de subsecvent, e - 2p)
3b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea corectă a subprogramului s, i a variabilelor locale - 1p; implemen-
tarea corectă a algoritmului de sortare - 9p)
3c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea variabilelor utilizate - 1p; parcurgerea tabloului S - 3p; stabilirea
indicilor corespunzători s, i apelul corect a subprogramului de la punctul (b) - 6p)
3d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
Răspuns: este suficient să se cunoască numărul de subsecvent, e de valori cu
aceeas, i paritate (valoarea N ); regula de decizie: “dacă N este par atunci Ana ı̂ncepe
jocul, altfel o lasă pe Maria să ı̂nceapă”.
Problema 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35 pct.
4a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
Variantă de rezolvare: se construies, te un tabel de frecvent, e corespunzător
naturale cuprinse ı̂ntre 1 s, i 9 s, i se verifică dacă toate elementele tabloului de frecvent, e
sunt egale cu 1.

61
(declararea corectă a funct, iei, a variabilelor locale s, i returnarea rezultatului -
1p; verificarea condit, iei că elementele au valori distincte - 9p)
4b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 pct.
(declararea corectă a tabloului bidimensional S - 2p)
4c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
Variantă de rezolvare: se construies, te un tablou unidimensional cont, inând
elementele subtabloului s, i se apelează funct, ia de la punctul (a)
(declararea corectă a funct, iei, a variabilelor locale s, i returnarea rezultatului
- 1p; parcurgerea corectă a elementelor subtabloului - 2p; verificarea condit, iei că ele-
mentele au valori distincte - 2p)
4d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 pct.
(declararea corectă a subprogramului s, i a variabilelor locale - 1p; verifica-
rea proprietăt, ii la nivel de linii - 3p; verificarea proprietăt, ii la nivel de coloane - 3p;
verificarea proprietăt, ii la nivel de subtablouri - 8p)
4e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 pct.
Răspuns: vi. (9 − k)!

62
3.3 Sesiunea Iulie 2018
1. (40p)

(a) (5p) Se consideră suma S = 1 − 1/3 + 1/5 − 1/7 + 1/9 − . . . (primul termen
este 1, al doilea termen este −1/3 etc.).
i. Care este expresia corespunzătoare celui de al k−lea termen?
A. 1/(2k − 1);
B. 1/(2k + 1);
C. (−1)k /(2k − 1);
D. (−1)k+1 /(2k − 1);
E. (−1)k+1 /(2k + 1).
ii. Scriet, i o funct, ie ı̂n C/C++/Pascal care primes, te ca parametru un
număr natural n ≥ 2 s, i returnează suma primilor n termeni din S.
(b) (5p) Un număr natural este considerat tip “dublu-unu” dacă reprezentarea
sa ı̂n baza 2 cont, ine exact o pereche de cifre consecutive egale cu 1 (numerele
3 = (11)2 , 6 = (110)2 sunt de tip “dublu-unu”, dar numerele 5 = (101)2 s, i
7 = (111)2 nu sunt de acest tip).
i. Câte numere de tip “dublu-unu” sunt ı̂n intervalul (0, 2d )?
ii. Care dintre următoarele afirmat, ii este adevărată pentru orice număr n
de tip “dublu-unu” din (0, 2d ) :
A. există 1 ≤ k ≤ d astfel ı̂ncât n = 2k − 2k−1 ;
B. există 1 ≤ k < d astfel ı̂ncât n = 2k + 2k−1 ;
C. există 0 < k < d astfel ı̂ncât n = 2k+1 + 2k−1 ;
D. există 1 ≤ k < d astfel ı̂ncât n = 2k + 1.
(c) (10p) Se consideră un serviciu web la care utilizatorii se conectează/deco-
nectează s, i se pune problema determinării numărului maxim de utilizatori
conectat, i simultan pornind de la o secvent, ă de semnale de forma: 1 (s-a
conectat un utilizator), 0 (s-a deconectat un utilizator). De exemplu, pen-
tru secvent, a 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0 numărul maxim de utilizatori
conectat, i simultan este 5. Scriet, i o funct, ie C/C++/Pascal care primes, te
un tablou de semnale precum s, i numărul acestora s, i returnează numărul
maxim de utilizatori conectat, i simultan.
(d) (10p) Pentru un număr natural nenul n se pune problema determinării
numărului de zerouri finale (de exemplu, 304500 cont, ine două zerouri finale,
30245 cont, ine 0 zerouri finale).
i. Scriet, i o funct, ie C/C++/Pascal (nerecursivă) care primes, te ca para-
metru numărul n s, i returnează numărul de zerouri finale.
ii. Scriet, i o funct, ie C/C++/Pascal recursivă care efectuează aceeas, i pre-
lucrare.
(e) (10p) Se consideră că un text a fost tehnoredactat folosind o tastatură
defectă care “multiplică” simbolurile tastate s, i se pune problema “curăt, irii”
acestui text prin eliminarea caracterelor ı̂n exces (se presupune că textul
cont, ine doar cuvinte ı̂n care nu intervin simboluri consecutive identice).

63
De exemplu, textul “Acccceessttta eesttte uuun exxeeemmpplluu” trebuie
transformat ı̂n “Acesta este un exemplu”. Considerând că textul este stocat
ı̂ntr-un tablou cu elemente de tip caracter scriet, i:
i. o funct, ie/procedură care construies, te un nou tablou de caractere care
cont, ine textul curăt, at (pentru exemplul de mai sus noul tablou va avea
22 de caractere s, i va cont, ine “Acesta este un exemplu”);
ii. o funct, ie/procedură care transformă tabloul init, ial astfel ı̂ncât pe pri-
mele pozit, ii să fie textul curat (ı̂n exemplul de mai sus noul cont, inut al
tabloului este “Acesta este un exempluuuun exxeeemmppllluu”). Nu
este permisă utilizarea unui tablou adit, ional.
2. (25p) Se consideră un set de n oras, e, numerotate de la 1 la n (n ≤ 50), s, i o
“hartă” a conexiunilor aeriene dintre aceste oras, e stocată sub forma unei matrici
A cu n linii s, i n coloane ı̂n care elementul aij este 1 dacă există conexiune directă
ı̂ntre oras, ele i s, i j s, i este 0 dacă nu există conexiune directă (se presupune că
aii = 0 s, i aij = aji pentru orice i s, i j din mult, imea {1, 2, . . . , n}).
Exemplu: Se consideră 5 oras, e s, i matricea de conectivitate directă:
 
0 1 0 0 1
1 0 0 1 1
 
A= 0 0 0 1 1

0 1 1 0 1
1 1 1 1 0

(a) Scriet, i o funct, ie/procedură care construies, te tabloul D care cont, ine pentru
fiecare oras, numărul de conexiuni directe (D[i] cont, ine numărul de conexiuni
directe care pornesc din oras, ul i). Exemplu: D = [2, 3, 2, 3, 4].
(b) Scriet, i o funct, ie/procedură care primes, te ca parametru tabloul D s, i afis, ează
oras, ele ı̂n ordinea descrescătoare a numărului de conexiuni directe. Exem-
plu: valorile afis, ate sunt 5, 2, 4, 1, 3.
(c) Scriet, i o funct, ie/procedură care primes, te ca parametri matricea conexiuni-
lor s, i indicii a două oras, e (i s, i j) s, i afis, ează toate variantele de a ajunge din
oras, ul i ı̂n oras, ul j făcând cel mult o escală. Exemplu: pentru i = 2, j = 5
se afis, ează: (2, 5), (2, 1, 5), (2, 4, 5).
(d) Scriet, i o funct, ie/procedură care calculează matricea B = A2 = A × A.
(e) În ipoteza că fiecare oras, este conectat direct cu cel put, in un alt oras, ,
care dintre următoarele afirmat, ii, referitoare la elementele matricii B, este
adevărată?
i. bii = 0 s, i bij = bji pentru orice i s, i j din mult, imea {1, 2, . . . , n};
ii. bii > 1 pentru orice i din mult, imea {1, 2, . . . , n} s, i există cel put, in o
pereche de (i, j) cu proprietatea că bij 6= bji ;
iii. bii cont, ine numărul de conexiuni directe ale oras, ului i. Argumentat, i
răspunsul selectat.
3. (25p) Un lucrător preia pachete (de dimensiuni diferite) de pe o bandă s, i le
stivuies, te astfel ı̂ncât să nu pună niciodată un pachet peste unul de dimensiune
mai mică (dacă un pachet nu poate fi plasat pe niciuna dintre stivele existente

64
este creată o nouă stivă). De exemplu, dacă dimensiunile pachetelor, ı̂n ordi-
nea ı̂n care sosesc pe bandă, sunt [3, 1, 2, 6, 5, 7, 4] atunci stivele constituite sunt
[3, 1], [2], [6, 5, 4], [7].

(a) Propunet, i o structură de date pentru reprezentarea stivelor s, i scriet, i o


funct, ie/procedură care primes, te ca parametri numărul de pachete s, i un
tablou cu dimensiunile acestora s, i care distribuie pachetele pe stive astfel
ı̂ncât numărul de stive create să fie cât mai mic (fiecare pachet este plasat
pe prima stivă pe care este posibil).
(b) Presupunând că numărul de stive create este k justificat, i faptul că cel mai
lung subs, ir strict crescător din tabloul dimensiunilor are k elemente (ele-
mentele din subs, ir nu sunt neapărat consecutive, dat trebuie să fie ı̂n aceeas, i
ordine ca ı̂n s, irul init, ial; de exemplu, [1, 2, 6, 7] este un subs, ir strict crescător
al s, irului [3, 1, 2, 6, 5, 7, 4]). Scriet, i o funct, ie/procedură care construies, te un
subs, ir strict crescător de lungime maximă.

BAREM
Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
Problema 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40 pct.
1a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
1(a)i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 pct.
(Răspuns corect: D.)
1(a)ii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 pct.
(declararea corectă a funct, iei, a variabilelor locale s, i returnarea rezultatului -
1p; descrierea corectă a calculului sumei - 2p)
1b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
1(b)i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 pct.
(Răspuns corect: d − 1)
1(b)ii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 pct.
(Răspuns corect: B.)
1c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea corectă a funct, iei, a variabilelor de lucru s, i returnarea rezultatului
- 1p; parcurgerea corectă a tabloului cu semnale - 2p; actualizarea corectă a numărului
de utilizatori activi - 3p; determinarea valorii maxime - 4p)
1d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
1(d)i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei, a variabilelor de lucru s, i returnarea rezultatului
- 1p; calculul corect al numărului de zerouri finale - 4p)
1(d)ii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 pct.

65
(declararea corectă a funct, iei, a variabilelor de lucru s, i returnarea rezultatului
- 1p; condit, ie corectă pentru ies, irea din apelul recursiv - 1p; apel recursiv corect - 1p;
calculul corect al numărului de zerouri finale - 2p)
1e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
1(e)i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea funct, iei/procedurii s, i a variabilelor utilizate - 1p; construirea co-
rectă a noului tablou - 4p)
1(e)ii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 pct.
(declararea funct, iei/procedurii s, i a variabilelor utilizate - 1p; transformarea
corectă a tabloului - 4p)
Problema 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25 pct.
2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei/procedurii s, i a variabilelor utilizate - 1p; calculul
sumei elementelor de pe fiecare linie (sau determinarea numărului de valori egale cu 1
de pe fiecare linie) s, i stocarea corectă ı̂n tabloul D - 4p)
2b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 pct.
(declararea corectă a funct, iei/procedurii s, i a variabilelor utilizate - 1p; im-
plementarea corectă a unei metode de sortare - 5p; asigurarea concordant, ei dintre
elementele tabloului D s, i numerele de ordine ale oras, elor - 1p; afis, area numerelor de
ordine ale oras, elor ı̂n ordinea cerută - 1p)
2c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei/procedurii s, i a variabilelor utilizate 1p; afis, area
traseului direct (dacă există) - 1p; afis, area tuturor traseelor cu o escală - 3p)
2d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei/procedurii s, i a variabilelor utilizate 1p; calculul
corect al produsului - 4p)
2e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 pct.
(răspuns corect: iii. - 1p; argumentare: bii = nk=1 aik · aki reprezintă numărul
P
oras, elor k conectate direct cu oras, ul i (aik = 1) - 1p)
Problema 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25 pct.
3a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 pct.
(definirea unei structuri de date adecvate - 5p; declararea corectă a funct, iei/
procedurii s, i a variabilelor utilizate - 1p; parcurgerea tabloului cu dimensiuni s, i com-
pletarea structurii - 9p)
3b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(justificarea faptului că un subs, ir strict crescător nu poate avea mai mult de un
element ı̂n aceeas, i stivă - 2p; declararea corectă a funct, iei/procedurii s, i a variabilelor
utilizate - 1p; construirea unui subs, ir strict crescător - 7p)

66
3.4 Sesiunea Iulie 2019
1. (35p)

(a) (10p)
i. (5p) Scriet, i o funct, ie ı̂n C/C++/Pascal care returnează 1 dacă un
număr ı̂ntreg pozitiv primit ca parametru este prim s, i 0 ı̂n caz con-
trar.
ii. (5p) Se consideră un tablou x cu n numere ı̂ntregi pozitive. Scriet, i o
funct, ie/procedură ı̂n C/C++/Pascal care afis, ează toate perechile de
indici (i, j) (i ≤ i < j ≤ n) pentru care suma x[i] + x[j] este număr
prim (se va folosi funct, ia de la punctul precedent).
(b) (10p) Se consideră o funct, ie f : {1, 2, . . . , m} → {1, 2, . . . , n}, (m, n ∈
N, m ≥ n) specificată prin tabloul valorilor sale: v este un tablou uni-
dimensional cu m elemente ı̂n care v[i] = f [i] (se presupune că indicele
tabloului pornes, te de la 1).
i. (2.5p) Care dintre următoarele proprietăt, i este suficientă pentru a ga-
ranta faptul că funct, ia f este bijectivă?
A. m = n;
B. m = n S, I v are elemente distincte (v[i] 6= v[j] pentru orice i 6= j);
C. m = n SAU v are elemente distincte (v[i] 6= v[j] pentru orice
i 6= j);
ii. (2.5p) Câte funct, ii bijective pot fi definite pe o mult, ime {1, 2, . . . , m}?
A. m;
B. m2 ;
C. m!;
2
D. Cm ;
2
E. Am .
iii. (5p) Scriet, i o funct, ie ı̂n C/C++/Pascal care primes, te ca parametru un
număr natural m ≥ 2 s, i un tablou v cu m elemente s, i care returnează
1 dacă v are toate elementele distincte s, i 0 ı̂n caz contrar.
(c) (10p) O secvent, ă de cifre binare este considerată “complementar-concate-
nată” dacă poate fi construită astfel: se pornes, te de la cifra 0 s, i la fiecare
etapă, secvent, a curentă este concatenată cu complementara ei. Exemple de
astfel de secvent, e sunt:

Număr de ordine Secvent, a

1: 0
2: 01
3: 0110
4: 01101001
5: 0110100110010110
... ...

67
i. (1p) Care dintre afirmat, iile referitoare la o secvent, ă “complementar-
concatenată” este adevărată?
A. numărul de elemente egale cu 1 din secvent, a cu numărul de ordine
n (n ≥ 2) este n − 1;
B. numărul de elemente egale cu 0 din secvent, a cu numărul de ordine
n (n ≥ 2) este 2(n − 2);
C. numărul de elemente egale cu 1 din secvent, a cu numărul de ordine
n (n ≥ 2) este 2n−1 ;
D. numărul de elemente egale cu 1 din secvent, a cu numărul de ordine
n (n ≥ 2) este 2n−2 .
ii. (4p) Scriet, i o funct, ie ı̂n C/C++/Pascal care primes, te ca parametri in-
dicii i s, i j a două elemente dintr-un tablou (variabilă globală) ce cont, ine
valori din {0, 1} (astfel ı̂ncât numărul de elemente din subtabloul definit
de i s, i j este un număr par) s, i returnează 1 dacă cele două jumătăt, i ale
subtabloului definit de i s, i j sunt complementare s, i 0 ı̂n caz contrar (de
exemplu, ı̂n tabloul (0, 0, 1, 0, 0, 1, 0, 1, 1, 0,1, 0)) subtabloul specificat
prin indicii i = 3 s, i j = 10 satisface proprietatea, dar subtabloul cores-
punzător din (0, 0, 1, 0, 0, 1, 0, 1, 0, 1,1, 0) nu satisface proprietatea.
iii. (5p) Scriet, i o funct, ie recursivă care verifică dacă un tablou este o
secvent, ă “complementar-concatenată”. Tabloul va fi considerat vari-
abilă globală (cu n elemente, unde n este o putere a lui 2), iar funct, ia
va primi ca parametri doi indici care specifică port, iunea din tablou care
va fi analizată ı̂n cadrul apelului curent.
(d) (5p) Se consideră că asupra unui tablou unidimensional a cu 2 ≤ n ≤
100 elemente din mult, imea {1, 2, . . . , n} init, ial definit astfel ı̂ncât a[i] = i
(se presupune că indicii ı̂ncep de la 1) a fost aplicată o transformare prin
deplasare circulară către dreapta sau stânga cu k pozit, ii (1 ≤ k < n). Se
pune problema determinării lui k pornind de la tabloul transformat fără a
efectua comparat, ii ı̂ntre elementele tabloului.
i. (2.5p) Care dintre următoarele afirmat, ii sunt adevărate?
A. dacă deplasarea este la dreapta atunci k = n − x[n]
B. dacă deplasarea este la stânga atunci k = n − x[n]
C. dacă deplasarea este la dreapta atunci k = x[1] − 1
D. dacă deplasarea este la stânga atunci k = x[1] − 1
E. indiferent de sensul deplasării k = n − x[n]
F. indiferent de sensul deplasării k = x[1] − 1
G. nu se poate determina k fără a efectua comparat, ii ı̂ntre elementele
tabloului
ii. (2.5p) Dacă se cunoas, te doar tabloul transformat, este posibil să se
determine sensul deplasării? Argumentat, i.
2. (25p) Se consideră o expresie algebrică ce poate cont, ine ca operanzi doar sim-
bolurile x, y s, i z, iar ca operatori doar + s, i −. Se presupune că expresia ı̂ncepe
ı̂ntotdeauna cu un operand (de exemplu, x + y − z + y + z + y s, i z + x + y − x
sunt expresii valide, dar −z + x + y − x, zx + y − x, z + −y − x nu sunt valide).
Se presupune că expresia este reprezentată printr-un tablou unidimensional (E)

68
cu elemente de tip caracter. Să se scrie câte o funct, ie/procedură care primes, te
tabloul de caractere, precum s, i numărul de elemente din acesta (N ) s, i efectuează
prelucrărilre:

(a) (10p) Returnează 1 dacă expresia este validă s, i 0 ı̂n caz contrar.
(b) (15p) Presupunând că expresia este validă, afis, ează varianta simplificată a
expresiei (de exemplu, pentru x + y − x + y + z + y varianta simplificată
este x + 3y, iar pentru y + x − z + x este 2x + y − z).

Pentru fiecare dintre funct, ii, pe lângă implementarea ı̂n C/C++/Pascal, se va


descrie pe scurt ideea de rezolvare.

3. (30p) Se consideră că o imagine alb-negru este reprezentată printr-o matrice I cu


M linii s, i N coloane s, i elemente din {0, 1} (0 corespunde cu alb s, i 1 corespunde
cu negru) s, i se presupune că imaginea cont, ine un disc alb pe fond negru, astfel
ı̂ncât discul este ı̂ncadrat de cel put, in o linie s, i o coloană de elemente egale cu 1
(vezi Figura 1a).

(a) (10p) Scriet, i o funct, ie cu numele Verific care primes, te ca parametru un


tablou unidimensional cu elemente din {0, 1} s, i numărul de elemente din
tablou s, i returnează: 0 dacă toate elementele din tablou sunt egale cu 1; 1
dacă tabloul este de forma {1, . . . , 1, 0, . . . , 0, 1, . . . , 1} (cel put, in un zero
ı̂ncadrat de cel put, in un unu); 2 dacă tabloul cont, ine cel put, in două port, iuni
de elemente egale cu 0 separate prin cel put, in un element egal cu 1 (de exem-
plu, (1, 1, 0, 0, 1, 0, 1) s, i (1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1) au această proprietate);
(b) (10p) Scriet, i o funct, ie care are acces la matricea I (considerată variabilă
globală) s, i foloses, te funct, ia Verific descrisă la punctul (a) pentru a deter-
mina diametrul discului exprimat ı̂n număr de linii ale matricii (vezi Figura
3.1).
(c) (10p) Se presupune că la achizit, ia imaginii ar fi putut interveni erori astfel că
interiorul discului alb poate cont, ine pete negre (vezi Figura 3.2). Prezentat, i
pe scurt ideea unei metode care să permită verificarea prezent, ei unor pete
negre ı̂n interiorul discului. Implementat, i ideea ı̂ntr-o funct, ie care are acces
la matricea I s, i returnează 1 dacă discul nu cont, ine pete negre s, i 0 ı̂n caz
contrar.
Indicat, ie: se poate folosi funct, ia de la punctul (a).

Figura 3.1 Figura 3.2

69
Notă: Pentru fiecare dintre funct, iile/procedurile scrise se vor specifica toate decla-
rat, iile de variabile globale s, i locale necesare s, i se vor pune comentarii explicative. NU
este necesară scrierea programului principal s, i preluarea datelor prin citire.

BAREM
Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
Problema 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35 pct.
1a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
1(a)i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei, a variabilelor de lucru s, i returnarea rezultatului
- 1p; descrierea corectă a algoritmului de verificare dacă un număr este prim - 4p)
1(a)ii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei/procedurii s, i a variabilelor de lucru - 1p; des-
crierea corectă a algoritmului de determinare a perechilor care au suma număr prim -
3p; afis, area perechilor - 1p)
1b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
1(b)i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 pct.
(Răspuns corect: B.)
1(b)ii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 pct.
(Răspuns corect: C.)
1(b)iii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei, a variabilelor de lucru s, i returnarea rezultatului
- 1p; descrierea corectă a algoritmului de verificare dacă elementele vectorului sunt
distincte - 4p)
1c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
1(c)i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 pct.
(Răspuns corect: D.)
1(c)ii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 pct.
(declararea corectă a funct, iei, a variabilelor de lucru s, i returnarea rezultatului
- 1p; descrierea corectă a algoritmului de verificare dacă jumătăt, ile tabloului sunt
complementare - 3p)
1(c)iii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
(declararea corectă a funct, iei, a variabilelor de lucru s, i returnarea rezultatului
- 1p; condit, ie corectă pentru ies, irea din apelul recursiv - 1p; apel recursiv corect - 1p;
verificarea proprietăt, ii de tablou complementar - 2p)
1d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 pct.
1(d)i. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 pct.

70
(Răspunsuri corecte: A., D.)
1(d)ii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 pct.
(Nu este posibil să se determine sensul transformării deoarece acelas, i rezultat
poate fi obt, inut prin deplasarea la dreapta cu k pozit, ii s, i prin deplasarea la stânga cu
h pozit, ii. De exemplu, pentru n = 5, tabloul (3, 4, 5, 1, 2) se poate obt, ine atât prin
deplasare la dreapta cu k = 3 pozit, ii cât s, i prin deplasare la stânga cu h = 2 pozit, ii).
Problema 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25 pct.
2a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea corectă a funct, iei, a variabilelor de lucru s, i returnarea rezultatului
- 1p; descrierea corectă a algoritmului de verificare dacă expresia este validă - 7p;
descriere idee de rezolvare - 2p)
2b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 pct.
(declararea corectă a funct, iei/procedurii s, i a variabilelor de lucru - 1p; deter-
minarea corectă a coeficient, ilor operanzilor (x, y s, i z) - 6p; afis, area corectă a expresiei
simplificate: verificare existent, ă operand - 3p; analiză semn - 3p; descriere idee de
rezolvare - 2p)
Problema 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 pct.
3a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea corectă a funct, iei s, i a variabilelor de lucru - 1p; descrierea corectă a
algoritmului de verificare că toate elementele din tablou sunt egale cu 1 - 3p; descrierea
corectă a algoritmului de verificare că există cel put, in un zero ı̂ncadrat de 1 - 5p;
returnarea rezultatului - 1p)
3b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(declararea corectă a funct, iei s, i a variabilelor de lucru - 1p; descrierea corectă a
algoritmului de determinare a indicilor liniilor de unde ı̂ncepe s, i unde se termină discul
(de exemplu, linia i1 s, i linia i2 ) - 8p; calculul diametrului (de exemplu, i2 − i1 + 1) s, i
returnarea rezultatului - 1p)
3c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 pct.
(descriere idee de rezolvare - 2p; declararea corectă a funct, iei, a variabilelor
de lucru s, i returnarea rezultatului - 1p; descrierea corectă a algoritmului de verificare
dacă discul cont, ine sau nu pete, prin parcurgerea liniilor matricii, apelând funct, ia de
la punctul (a) - 7p)

71

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