Sunteți pe pagina 1din 41

PINTESCU Alina, KALMAR Violeta-Mihaela

INFORMATICĂ
Auxiliar 1 - Rezolvări propuse pentru
Simulările de bacalaureat la informatică C++,
variantele 1 – 10

ISBN 978-973-0-32126-5

Baia Mare
2020
PINTESCU Alina, KALMAR Violeta-Mihaela
COLEGIUL NAȚIONAL ”GHEORGHE ȘINCAI” BAIA MARE

INFORMATICĂ
Auxiliar 1 - Rezolvări propuse pentru
Simulările de bacalaureat la informatică C++,
variantele 1 – 10

Baia Mare
2020
Cuprins

Simulare 1 - prof. Pintescu Alina ........................................................ 1

Simulare 2 - prof. Pintescu Alina ......................................................... 4

Simulare 3 - prof. Pintescu Alina ......................................................... 8

Simulare 4 - prof. Pintescu Alina ....................................................... 12

Simulare 5 - prof. Kalmar Violeta...................................................... 15

Simulare 6 - prof. Kalmar Violeta...................................................... 19

Simulare 7 - prof. Pintescu Alina ....................................................... 23

Simulare 8 - prof. Pintescu Alina ...................................................... 26

Simulare 9 - prof. Kalmar Violeta...................................................... 30

Simulare 10 - prof. Pintescu Alina ..................................................... 34

Resurse web ……………………………………………..………. 38


Simulare

1
REZOLVARE PROPUSĂ DE
PROF. ALINA PINTESCU

• Toate subiectele sunt obligatorii. Se acordă 10 puncte din oficiu.


• Timpul de lucru efectiv este de 3 ore.
• Identificatorii utilizaţi în rezolvări trebuie să respecte precizările din enunţ (bold), iar în lipsa unor precizări
explicite, notaţiile trebuie să corespundă cu semnificaţiile asociate acestora (eventual în formă prescurtată). Datele
de intrare se consideră corecte, validarea lor nefiind necesară.
• În grafurile din cerințe oricare arc/muchie are extremități distincte și oricare două arce/muchii diferă prin cel
puțin una dintre extremități.
SUBIECTUL I (20 de puncte)
Pentru fiecare dintre itemii de la 1 la 5, scrieţi pe foaia de examen litera corespunzătoare
răspunsului corect. Fiecare răspuns corect se notează cu 4 puncte.

Răspuns:
a

a) n%2!=1 && n%5==0

Răspuns:
c

f(102030)=20+f(10203) =20+20+f(1020)=40+20+f(102)=60+20+f(10)=80+2020=2100

Răspuns:
d
1 3 1 3 1 3 1
0 0 1 1 1 2 2 3 1 3 0
1 1 1 1 1 1 1 1 1 2 2 2
1 2 3 4 5 6 7 8 9 10 11 12

Răspuns:
b

Răspuns:
c
Pentru graf complet cu n=20 noduri ar trebui să avem m=n(n-1)/2 muchii, respectiv 20x19/2 = 190 muchii
Deci 190 – 100 muchii existente = 90 muchii necesare (c)

1
SUBIECTUL al II-lea (40 de puncte)

a) Răspuns corect: 2020


b) c) d)
Se acordă câte 3p. pentru #include <iostream> citeşte n (număr natural)
fiecare dintre cele două seturi using namespace std; p1; m0; k0
conform cerinţei int n,p=1,m=0,k=0,x,c; ┌cât timp n≠0 execută
(un set are două numere, a și b, int main() │ citește x (număr natural)
unde a fie este 0, fie are cifra {cin>>n; │ x[x/p]
unităților 9, iar b fie este while(n!=0) │┌dacă x≠0 atunci cx%10
format dintr-o singură cifră, fie { cin>>x; ││altfel cn%10
are cifra zecilor 4). for(int i=1;i<=k;i++) │└■
x=x/10; │ mc*p+m
if(x!=0) c=x%10; │ n[n/10]
else c=n%10; │ pp*10;
m=c*p+m; └■
n=n/10; scrie m
p=p*10;
k++;
}
cout << m;
return 0;}
struct triunghi
{
struct [coordonate]
{float x,y;} A, B, C;
} t;

Răspuns corect:

8viCtORIe

2
SUBIECTUL al III-lea (30 de puncte)
void putere(int n, int &d, int &p)
{ int pm,dm;
pm=p=0; dm=d=2;
while(n>1)
{ p=0;
while(n%d==0)
{ n/=d; p++; }
if(p>=pm)
{ pm=p;
dm=d; }
d++;
}
d=dm;
p=pm;
}
#include <iostream>
using namespace std;
int i,j,n,k,a[21][21],m;
int main()
{ cin>>n>>k;
for(i=1; i<=n; i++)
{ m=i;
for(j=1; j<=n*k; j++)
{ a[i][j]=m;
if(j%k==0) m++;
cout<<a[i][j]<<' ';
}
cout<<endl;
}
return 0; }

a b
#include <iostream>
#include <fstream> Din relația de recurență fn=3fn-1 – fn-2 putem deduce următoarea
using namespace std; relație: fn-2=3fn-1 – fn. Vom genera pe rând termenii șirului, în
ofstream fout("bac.txt"); ordine descrescătoare (conform regulei obținute) și vom afișa
int x,y,z; numerele obținute în fișier până după afișarea valorii 1.
int main()
{ cin>>y>>x; Rezolvarea propusă este eficientă dpdv al memoriei deoarece am
fout<<x<<' '; folosit un număr redus de variabile (trei variabile simple) și este
while(x!=1 && y!=1) eficientă dpdv al timpului de executare deoarece algoritmul este
{ z=3*y-x; x=y; y=z; de complexitate logaritmică [ O(log y) unde y = nr dat] – adică
fout<<x<<' '; } afișările cerute se vor face împărțind succesiv numărul dat.
fout<<1<<' '<<1;
fout.close(); return 0; }

3
2
Simulare
REZOLVARE PROPUSĂ DE
PROF. ALINA PINTESCU

SUBIECTUL I (20 de puncte)

Pentru fiecare dintre itemii de la 1 la 5, scrieţi pe foaia de examen litera corespunzătoare


răspunsului corect. Fiecare răspuns corect se notează cu 4 puncte.

1. Indicați o expresie care are valoarea 1 dacă şi numai dacă numărul memorat în variabila
întreagă x aparţine intervalului închis [-20,20].

a. !(x<-20) || (x>20)
b. x>-20 || x<20
c. !(x+20<0 && x-20>0)
d. x+20>=0 && x-20<=0

Răspuns: d

Răspuns: c f(2020,15) = f(2005,10) = f(1995,5) = f(1990,0) = 1990

Răspuns: b

4
Răspuns: b

Răspuns: a

5
SUBIECTUL al II-lea (40 de puncte)

a) Răspuns corect: 20950


b) c) d)
Se acordă câte citeşte n (număr natural)
2p. pentru m0
fiecare dintre Dacă n=0 atunci m=2
cele trei ┌cât timp n≠0 execută
numere │ cn%10; n [n/10]
conform │┌dacă c=0 atunci c2
cerinţei ││altfel
││┌dacă c%2=0 atunci
(oricare număr
│││c0
de forma ││└■
x0y0z, unde │└■
x,y și z sunt │ mm*10+c
cifre pare └■
nenule). scrie m
Răspuns:
struct specie
{ int cod;
int nrExemplare;
int varsta[10];
}s[20];

Rezolvare posibilă:

6
SUBIECTUL al III-lea (30 de puncte)

Metoda I Metoda II

a b
Am citit pe rând numerele din fișier unul câte unul, și
pe măsură ce le-am citit am testat dacă numărul citit
are ultimele 2 cifre conform cerinței (=20), și, dacă
da, am comparat numărul cu 3 valori posibile
maximale în ordinea max1<max2<max3, unde x
intră în poziția aferentă valorii.

Rezolvarea propusă este eficientă dpdv al memoriei


deoarece am folosit un număr minimal de valori
posibile (4 variabile) și este eficientă dpdv al
timpului de executare deoarece algoritmul este
liniar de complexitate O(n) – adică la o singură
parcurgere a valorilor se oferă soluția dorită.

7
3
Simulare
REZOLVARE PROPUSĂ DE
PROF. ALINA PINTESCU

SUBIECTUL I (20 de puncte)


Pentru fiecare dintre itemii de la 1 la 5, scrieţi pe foaia de examen litera corespunzătoare
răspunsului corect. Fiecare răspuns corect se notează cu 4 puncte.

Răspuns: d

f(3) se afis 3 x=2


x=1
f(2) se afis 2 x=1 Răspuns: b
f(1) se afis 1 x=0
f(0) se afis 0
La intoarcere
se intra in while la f(2) pt x=1, se apeleaza f(0) se afis 0
se intra in while la f(3) pt x=2 se apeleaza f(1), se afis 1,se intra in while si se apeleaza f(0)
si se afis 0
se intra in while la f(3) pt x=1 se apeleaza f(0) si se afis 0

Răspuns: c

Răspuns: a

8
Răspuns: b

Teoremă: Un graf neorientat fără vârfuri izolate este eulerian dacă și


numai dacă este conex și toate vârfurile au grad par.

SUBIECTUL al II-lea (40 de puncte)

a) Răspuns corect: 1 275


b) Se acordă câte 3p. pentru fiecare dintre cele două numere conform cerinţei (orice număr cu
cifre în ordine strict crescătoare, respectiv orice număr cu cifre în ordine strict
descrescătoare).
c) d)

citeşte n (număr natural, n>9)


c1n%10; n[n/10]; c2n%10
┌dacă c1=c2 atunci s0
│altfel
│┌dacă c1>c2 atunci s1
││altfel s-1
│└■
└■
c1n%10; n[n/10]; c2n%10;
┌cât timp (c1-c2)*s>0
│ c1n%10; n[n/10]; c2n%10
└■
scrie s,' ',n

9
M1 M2
struct cerc struct coord
{float raza; {float x,y;}
struct [coordonate] struct cerc
{ float x; {float raza;
float y;} centru; [struct] coord centru;
}fig; }fig;

Rezolvare propusă:

SUBIECTUL al III-lea (30 de puncte)

10
a b
Am citit pe rând valorile în variabila x și am reținut
prima și ultima poziție atât a unui element negativ cât și
a unui element pozitiv. La final am analizat diferența
maximă convenabilă conform cerinței.

Rezolvarea propusă este eficientă dpdv al memoriei


deoarece am folosit un număr minimal de valori posibile
(7 variabile) și este eficientă dpdv al timpului de
executare deoarece algoritmul este liniar de
complexitate liniară [ O(n) unde n=nr de nr citite] –
adică la o singură parcurgere a valorilor se oferă soluția
dorită.

Metoda 2 - barem Am citit pe rând valorile în variabila x și am reținut


prima și ultima poziție a unui element negativ, și în
variabila i s-au contorizat toate numerele citite. La final
am analizat diferența maximă convenabilă conform
cerinței.

Rezolvarea propusă este eficientă dpdv al memoriei


deoarece am folosit un număr minimal de valori posibile
(5 variabile) și este eficientă dpdv al timpului de
executare deoarece algoritmul este liniar de
complexitate liniară [ O(n) unde n=nr de nr citite] –
adică la o singură parcurgere a valorilor se oferă soluția
dorită.

11
4
REZOLVARE PROPUSĂ DE
PROF. ALINA PINTESCU
Simulare

SUBIECTUL I (20 de puncte)


Pentru fiecare dintre itemii de la 1 la 5, scrieţi pe foaia de examen litera corespunzătoare
răspunsului corect. Fiecare răspuns corect se notează cu 4 puncte.

Răspuns: a

Răspuns: b

Răspuns: d

Răspuns: c

Răspuns: b

Definiție: Într-un graf neorientat, se numește lanț eulerian un lanț simplu


în care apare fiecare muchie (fiind lanț simplu, fiecare muchie apare o
singură dată).
Un graf neorientat fără vârfuri izolate conține un lanț eulerian, dacă și
numai dacă este conex și toate vârfurile au grad par, mai puțin două.
Aceste vârfuri vor fi extremitățile lanțului eulerian.

12
SUBIECTUL al II-lea (40 de puncte)

a) Răspuns corect: 3334


b) Se acordă câte 2p. pentru fiecare dintre cele trei numere conform cerinţei (oricare dintre
numerele 1014, 1015, 1016, 1017)
c) d)
citeşte n (număr natural)
┌repetă
│ c1n%10; n[n/10];
c2n%10
│┌dacă c1>c2 atunci
││ c2c1; c1n%10
│└■
│dacă c1<c2 atunci
│┌repetă
││ scrie c1
││ c2[c2/2]
│└ până când c1>=c2
└până când n≤9

Răspuns: opusqrdzdce

13
SUBIECTUL al III-lea (30 de puncte)
void generatoare(int n)
{ int a,b,ok=0;
for(a=1;a<=n/2;a++)
for(b=1;b<=n/2;b++)
{
if(a*b+a/b==n &&
a%2==0)
{cout<<a<<'-'<<b<<' ';
ok=1;}
}
if(ok==0)
cout<<"nu exista";
}

a b
Am citit prima variabilă în ante și am inițializat un contor
#include <iostream>
k=1, iar apoi am citit una câte una, restul valorilor în
#include <fstream> variabila nr. Am verificat dacă valoarea citită este egală
using namespace std; cu cea anterioară, dacă da, am incrementat k, dacă nu, am
ifstream fin ("bac.in");
int main() verificat dacă valoarea lui k =2 atunci am afișat nr în
{ int z,a,b,c,ok=0; cauză și am menționat schimbând valoarea lui ok, apoi am
fin>>z>>a>>b;
while(fin>>c)
resetat contorul k=1. Înainte de a citi numerele din fișier
{ am reținut tot timpul în ante valoarea anterioară citită. La
if(a==b&&b!=c&&z!=a) final am mai verificat aceleași condiții și pentru ultima
{ cout<<b<<' ';
ok=1; } valoare. Dacă variabila ok a rămas nemodificată am afișat
z=a; mesajul ”nu exista” deoarece nu s-a găsit nici o valoare
a=b;
b=c;
conform cerinței.
}
if(a==b&&z!=a) Rezolvarea propusă este eficientă dpdv al memoriei
{ cout<<b<<' ';
ok=1; deoarece am folosit un număr minimal de valori posibile
} (4 variabile) și este eficientă dpdv al timpului de
if(ok==0)
cout<<"nu exista";
executare deoarece algoritmul este liniar de complexitate
} liniară [O(n) unde n=nr elem] – adică la o singură
parcurgere a valorilor se oferă soluția dorită. Am folosit
faptul că numerele erau date în ordine descrescătoare.

14
5
Simulare
REZOLVARE PROPUSĂ DE
PROF. VIOLETA KALMAR

SUBIECTUL I (20 de puncte)


Pentru fiecare dintre itemii de la 1 la 5, scrieţi pe foaia de examen litera corespunzătoare
răspunsului corect. Fiecare răspuns corect se notează cu 4 puncte.
1. Indicați o expresie C/C++ care are valoarea 1 dacă și numai dacă
numărul natural memorat în variabila întreagă x are exact o cifră.
Răspuns: a
a. x/10==0 b. x%10==0
c. (x/10)/10==0 d. (x%10)%10==0
2. Subprogramul f este definit alăturat. void f(int n)
Scrieți ce se afișează în urma apelului de { int i;
for(i=n;i>=1;i--)
mai jos. f(3); (6p.)
{ f(n-1); cout<<i; Răspuns: b
} }
a. 121321 b 121131211212111 c 322111 d. 3211122
1111211
1
F(3) i=3 F(2) i=2 F(1) i=1 F(0) se încheie
{2) (1)
i=1 F(1 i=1 F(0) se încheie
(5) (4) (3)
i=2 F(2) i=2 F(1) i=1 F(0) se încheie
Valorile se tipăresc
(7) (6) în ordinea
i=1 F(1) i=1 F(0) se încheie numerotării cu
(10) (9) (8)
i=1 F(2) i=2 F(1) i=1 F(0) se încheie roșu!!!
(12) (11)
i=1 F(1) i=1 F(0) se încheie
(15) (14) (13)
3. Utilizând metoda backtracking, se generează toate modalitățile de a pregăti o
ținută, luând, într-o anumită ordine, articolele din mulțimea {cămașă, cravată,
pantaloni, pantofi, sacou, șosete}, având în vedere următoarele restricții:
cămașa va fi luată înaintea cravatei, cravata înaintea sacoului și atât șosetele, cât
și pantalonii, înaintea pantofilor. Primele trei soluții generate sunt, în această
ordine: (cămașă, cravată, pantaloni, sacou, șosete, pantofi), (cămașă,
cravată, pantaloni, șosete, pantofi, sacou), (cămașă, cravată, Răspuns: c
pantaloni, șosete, sacou, pantofi). Indicați cea de a șasea soluție
generată.
a. (cămașă, cravată, sacou, șosete, pantaloni, pantofi)
b. (cămașă, cravată, șosete, pantaloni, sacou, pantofi)
c. (cămașă, cravată, șosete, pantaloni, pantofi, sacou)
d. (cămașă, cravată, șosete, sacou, pantaloni, pantofi)
4. Un arbore cu 9 noduri, numerotate de la 1 la 9, este reprezentat prin
vectorul de „tați” (2,7,0,8,1,5,3,9,2). Rădăcina arborelui este: Răspuns: b
a. 1 b. 3 c. 4 d. 6
5. Matricea de adiacență a unui graf neorientat cu 2020 de noduri are 200 de
elemente nenule. Numărul maxim de componente conexe ale grafului este:
a. 2006 b. 2000 c. 1820 d. 400

Răspuns: a

15
SUBIECTUL al II-lea (40 de puncte)

a) Răspuns corect: D10


b) 2 3 5 6 7 8, numere >2 care nu sunt pătrate perfecte
c) d)
citeste n (număr natural)
dacă n>1 și √ =[√ atunci
scrie ’D’, √
altfel
scrie ’N’

2. Variabila s memorează simultan numărul de soluții complexe ale unei Răspuns


ecuații (număr natural din intervalul [2,102)) și soluțiile propriu-zise (partea struct ecuatie
reală și partea imaginară, numere reale). Știind că expresiile C/C++ de mai jos {
au ca valori numărul de soluții ale unui ecuații, partea reală, respectiv partea
imaginară a primei sale soluții, scrieți definiția unei structuri cu eticheta
int numar;
ecuatie, care permite memorarea datelor despre soluțiile unei ecuații, și struct [nume]
declarați corespunzător variabila s. { float pre, pim;}
s.numar s.solutie[0].pre s.solutie[0].pim solutie[105];
(6p.)
} s;

Răspuns
for (i=0;i<6; i++)
for (j=0; j<6; j++)
if (j<3)
if (i>j && i+j<5)
a[i][j]='*';
else
a[i][j]='(' ;
else
if(i<j && i+j>5)
a[i][j]='*' ;
else
a[i][j]=')' ;

16
SUBIECTUL al III-lea (30 de puncte)
int baza (int n)
{ int mx=0;
if (n==0)
return 2;
else
do
{if (n%10>mx)
mx=n%10;
n=n/10;
}while (n!=0);
return mx+1;
}
#include <iostream>
#include <cstring>
using namespace std;
int main()
{int n,i,k=0;
char s[101],*p;
cin.get(s,101);
p=strtok(s," "); //despărțitor
while(p)
{if (p[0]>='0'&& p[0]<='9')
if (strchr(p,',')==NULL)
k++;
p=strtok(NULL," "); //șterg
cuv
}
cout<<k;
return 0;}

17
Varianta 1 Varianta 2
#include <iostream>
#include <iostream>
#include <fstream>
#include <fstream>
using namespace std;
using namespace std;
ifstream f("bac.txt");
ifstream f("bac.txt");
int main()
int main()
{
{ int crt,smax=-1001,sc=0;
int crt,smax=-1001,sc=0,smn=0;
while (f>>crt)
while (f>>crt)
{ sc=sc+crt;
{ sc=sc+crt;
if (sc>smax)
if(sc-crt>smax)
smax=s;
smax=sc-crt;
if(sc<0)
if( smn>sc)
sc=0;
sc=smn;
}
}
cout<<smax;
cout<<smax;
f.close();
f.close();
}
}

Avem sc suma elementelor citite din fișier Se parcurge fișierul citind pe rând fiecare
până la elementul curent (crt). Deci, suma valoare (crt).
maximă a unei subsecvențe (smax) se obține Pe lăngă smax care memorează valoarea
scăzând din sc cea mai mică sumă maximă a unei secvențe, în sc se păstrează
parțială onbținută până atunci. suma unei secvențe curente pozitive.
Așadar, ideea este să parcurgem fișierul Practic se va impărți șirul în subsecvențe
menținând suma secvenței curente (sc), cât căt mai lungi de sume positive sau negative,
și suma parțială minimă din secvența curentă Cele positive sunt candidate la suma maximă,
(smn). cele negative nu.
La fiecare pas calculăm suma maximă a Ideea este că la fiecare pas să adunăm la sc
unei subsecvențe ce se termină pe poziția valoarea curentă citită din fișier, actualizăm
curentă și actualizăm maximul global dacă e dacă este cazul suma maximă şi, dacă sc a
cazul. devenit negativă, atunci o reiniţializăm cu 0.
Eficiența rezolvării constă în faptul că nu se Eficiența rezolvării constă în faptul că nu se
utilizează tablouri, și printr-o singură utilizează tablouri, și printr-o singură
parcurgere a fișierului se determină suma parcurgere a fișierului se determină suma
maximă, complexitatea fiind în mod maximă, complexitatea fiind în mod
evident O(n) unde n=nr de nre citite din evident O(n) unde n=nr de nre citite din fisi.
fisier.

18
6
REZOLVARE PROPUSĂ DE Simulare
PROF. VIOLETA KALMAR

//Explicațiile le-am făcut eu, nu trebuie scrise pe foaia de examen!!!


SUBIECTUL I
1. c
Explicație:
expresia este echivalentă cu (x>=18) &&
(x>=19 && x<=20) && (x<=21) care are
valoarea 1 doar dacă toate parantezele au
valoare 1, deci dacă x>=19 && x<=20
2. c

Explicație:
Ultima soluție este varianta d. Penultima
este c.

3. a
Explicație:
Pentru ca segmentul AB să intersecteze axa
Oy produsul abciselor celor două puncte
trebuie să fie <=0. Accesul la un câmp al
structurii se face variabilă.câmp
4. d

5. b
Explicație:
Graf tare conex=există drumuri între
oricare două noduri x și y, atât de la x la y
sau cât și de la y la x.
1 -> 2 si 4 -> 2

sau
1 -> 2 si 4 -> 3

19
SUBIECTUL al II-lea

a. 4
b. 19 20
Explicație: variabila nr se mărește doar pentru un număr impar din intervalul [1..n] (doar atunci y>0) în intervalul
1..19 sunt 10 numere impare, dar și în intervalul 1..20
c. d.
#include <iostream> Citeste n (numar natural
using namespace std; nenul)
int main() y0
{ int n,i=1,j,r,x,y,nr=0; pentru i1,n executa
while (i<=n) x 0
{ x=0; y=1; j=1; y  1
While (j<i) j  1
{r=2*x-y; cat timp j<i executa
x=y; r  2*x-y
y=r;
x  y
j=j+1; }
y  r
i=i+1;
if (y>0) nr++; j  j+1
} sf cat timp
cout<<nr; daca y>0 atunci
return 0;} nr  nr+1
sf pentru
scrie nr

x1=6 x2=10

for (i=0; i<=3; i++) for (i=0; i<=3; i++) for (i=0; i<=3; i++)
for (j=0; j<=4; j++) for (j=0; j<=4; j++) for (j=0; j<=4; j++)
a[i][j[=5*(4-i-1) +j+1; if(i==0 && j==0) a[i][j]=16+j-5*i;
a[i][j]=16;
else
if(j>0)
a[i][j]=a[i][j]+1;
else
a[i][j]=a[i-1][j]-5;

20
SUBIECTUL al III-lea

void prodprim (int n, long long &p)


{ int d=2, e;
p=1;
while (n>1)
{ e=0;
// e exponentul lui d din desc numărului n
while (n%d==0)
{ n=n/d;
e++;
}
if (e!=0)
p=p*d;
d++;
}
}
EX: descompunerea în factori primi și
efectuarea produsului factorilor primi, (care de
altfel sunt divizori primi pentru un număr)
dacă factorul respectiv apare măcar la puterea
1 în descompunere.
Este o funcție void pentru că rezultatul, chiar
dacă este o singură valoare, trebuie returnat
prin intermediul unui parametru al funcției.
#include <iostream>
#include <cstring>
using namespace std;
int main ()
{char s[101], *p;
int voc, cons, i,k;
cin.get(s,101);
p=strtok(s,” ” );
while (p)
{voc=0;cons=0;
for (i=0; i<strlen(p); i++)
if (strchr(”aeiou”, p[i])!=NULL)
voc++;
else
cons++;
if (voc < cons)
{cout<<p<<endl;
k++;
}
p=strtok(NULL,” ” );
}
if (k==0)
cout<< ”nu exista”;
return 0;
}

21
a b
#include <iostream> Am generat toate numerele de 7 cifre stabilind toate
#include <fstream> valorile posibile pentru prima cifra, cifrele din mijloc
using namespace std; și penultima cifră, celelalte calculându-le în funcție
ofstream f (”bac.out”); de valoarea acestora. M-am asigurat că pentru fiecare
int main() număr generat valorile calculate să fie cifre (<9 și
valori întregi).
{int a, b, c, d, x, i, p1, p2, k=0; Am tipărit apoi fiecare număr generat cifră cu cifră.
cin>>p1>>p2;
for (a=9; a>=1; a--) Eficiența rezolvării dpdv al timpului de execuție
{ b=p1/a; constă în faptul ca nu am parcurs domeniul
if (b<9 && a*b==p1) numerelor de 7 cifre (1000000-9999999) pentru a
{ for (c=9; c>=1; c--) verifica dacă au proprietatea cerută, ci le-am generat
{d=p2/c; ținând cont de proprietățile cerute, rezultând un
if (d<=9 && c*d==p2) algoritm de complexitate constanta O(1).
for (x=9; x>=0;x--) Eficieța rezolvării dpdv al memoriei constă în faptul
ca am utilizat doar câteva variabile simple (fără
f<<a<<b<<x<<x<<x<<c<<d<<endl; tablouri sau alte tipuri de date structurate)
} //număr de forma abxxxcd
}
}
f.close();
return 0;
}

22
7
Simulare
REZOLVARE PROPUSĂ DE
PROF. ALINA PINTESCU

SUBIECTUL I (20 de puncte)


Pentru fiecare dintre itemii de la 1 la 5, scrieţi pe foaia de examen litera corespunzătoare
răspunsului corect. Fiecare răspuns corect se notează cu 4 puncte.

Răspuns: d

x>=2001 && x<=2002 | | x>=2019 && x<=2020


Răspuns: a

Răspuns: b

Răspuns: c
Nodurile 1, 3 si 4

Răspuns: c

23
SUBIECTUL al II-lea (40 de puncte)

a) Răspuns corect: 7533


b) Răspuns corect: 20 88
c) d)
citește n
(număr natural nenul)
x1; m0; p1
┌repetă pentru x1, 9, +2 execută
│cnn
│┌cât timp cn≠0 execută
││ccn%10; cn[cn/10]
││ ┌dacă c=x atunci
││ │mc*p+m; pp*10
││ └■
│└■
│ xx+2 -----
└ până când x>=10 sf pentru
scrie m

*Se știe că pornește cu x=1, deci nu trebuie testat x la început

struct biblio
{int numar;
struct [datecarti]
{char titlu[21];
char autor[21];
}carte[100];
}c;
Răspuns corect:
ou
rosu

24
SUBIECTUL al III-lea (30 de puncte)
int putere(int n, int p)
{ int k=0;
If(p<2) return -1;
for(int
d=2;d<=p/2;d++)
if(p%d==0)
return -1;
while(n%p==0)
{ k++;
n=n/p; }
return k; }

a b
Avem s suma elementelor citite din fișier până la
elementul curent (nr). Deci, suma minimă a unei
subsecvențe (smin) se obține adunând la s cea mai
mică sumă parțială obținută până atunci.
Așadar, ideea este să parcurgem fișierul
menținând suma secvenței curente (s), cât și suma
parțială minimă din secvența curentă (smin).
La fiecare pas calculăm suma minimă a unei
subsecvențe ce se termină pe poziția curentă și
actualizăm minimul global dacă e cazul.
Rezolvarea propusă este eficientă dpdv al
memoriei deoarece am folosit un număr minimal
de valori posibile (3 variabile) și este eficientă
dpdv al timpului de executare deoarece
algoritmul este liniar de complexitate liniară [O(n)
unde n=nr elem] – adică la o singură parcurgere a
valorilor se oferă soluția dorită. Am încercat ca
printr-o singură parcurgere a fișierului să se
determine suma cerută.

25
8
Simulare
REZOLVARE PROPUSĂ DE
PROF. ALINA PINTESCU

SUBIECTUL I (20 de puncte)

Pentru fiecare dintre itemii de la 1 la 5, scrieţi pe foaia de examen litera corespunzătoare


răspunsului corect. Fiecare răspuns corect se notează cu 4 puncte.

Răspuns: b

x>=-2020 && x<=-2019 | | x>=2019 && x<=2020


!(x<-2020 | | x>-2019) | | !(x<2019 | | x>-2019)

Răspuns: a

Răspuns: c

Răspuns: d

f1 nu este corect, contraexemplu f1(12,2)

26
Răspuns: b

Un subgraf al grafului G, se obține ştergând eventual anumite


vârfuri şi odată cu acestea şi muchiile care le admit ca extremitate (nu se pot
şterge toate vârfurile deoarece s-ar obține un graf cu mulțimea vârfurilor vidă).

SUBIECTUL al II-lea (40 de puncte)

a) Răspuns corect: 202888


b) Se acordă câte 3p. pentru fiecare dintre cele două numere conform cerinței (oricare
două dintre numerele 101, 110, 900).
c) d)
citește x,y
(numere naturale)
cx%10
x[x/10]
┌dacă c≠0 atunci
│┌dacă y%10<c atunci
││ yy*10+c
││altfel
││ yy*10-c
│└■
└■
┌cât timp x≠0 execută
│ cx%10
│ x[x/10]
│┌dacă c≠0 atunci
││┌dacă y%10<c atunci
│││ yy*10+c
│││altfel
│││ yy*10-c
││└■
│└■
└■
scrie y

27
*Lipsește 5: 3, 4, 6

- scriere a unui lanț conform cerinț ei (3p)


(*) Se acordă numai 2p. dacă s-a precizat un lanț, dar nu este
elementar.
- scriere a unui ciclu conform cerinței (3p)
(**) Se acordă numai 2p. dacă s-a precizat un ciclu, dar este
elementar.
Lanț elementar= lanțul care conține numai vârfuri distincte,
două câte două
Ciclu ne-elementar: Se numește ciclu un lanț simplu în care
primul vârf este identic cu ultimul. Dacă toate vârfurile sunt
distincte, mai puțin primul și ultimul, se numește ciclu
elementar.
Răspuns corect:
ou
rosu

SUBIECTUL al III-lea (30 de puncte)

int prim(int x)
{ int kd=0;
for(int d=2;d<x;d++)
if(x%d==0)
kd++;
if(kd==0&&x>1)
return 1;
else return 0;
}
int sum(int n)
{ int s=0,i;
for(i=2;i<=n;i++)
if(n%i==0&&prim(i))
s=s+i;
return s;
}

28
a b
Am citit pe rând valorile în variabila x și am
#include <iostream>
reținut într-un vector de frecvență vuc de
#include <fstream>
câte ori apare un număr citit cu ultima cifră,
using namespace std;
repectiv marcăm de fiecare dată poziția
ifstream fin("bac.in");
acestuia în vectorul paralel vpoz. Pe parcurs
int vuc[10],vpoz[10],i,mx,x,u;
aflăm și numărul maxim convenabil conform
int main()
cerinței. La final parcurgem vectorul de
{while(fin>>x)
frecvență existent pentru ultima cifră a a nre-
{u= x%10;
lor citite și afișăm pozițiile pe care se află
vuc[u]++;
maximul determinat la parcurgere.
i++;
vpoz[u]=i;
Rezolvarea propusă este eficientă dpdv al
}
memoriei deoarece am folosit un număr minimal
for(i=0;i<10;i++)
de valori posibile (3 variabile simple și doi
if(vuc[i]>mx)
vectori de frecvență de câte 10 valori posibile) și
mx=vuc[i];
este eficientă dpdv al timpului de executare
for(i=0;i<10;i++)
deoarece algoritmul este liniar de complexitate
if(vuc[i]==mx)
liniară [ O(n) unde n=nr de nr citite] – adică la o
cout << vpoz[i]<<' ';
singură parcurgere a valorilor se oferă soluția
return 0;}
dorită.

29
9
REZOLVARE PROPUSĂ DE
Simulare
PROF. VIOLETA KALMAR

//Explicațiile le-am făcut eu, nu trebuie scrise pe foaia de examen!!!


SUBIECTUL I
1. d

2. b

Explicație:
Elementele diagonalei secundare
a[0][5]=(0%2)*5+(5%2)*0 = 0
sunt
a[1][4]=(1%2)*4+(4%2)*1 = 4 a[i][5-i]=i%2*(5-i)+(5-i)%2+i,
a[2][3]=(2%2)*3+(3%2)*2 = 2 pentru i=0..5 adică 0, 4, 2, 2, 4, 0
a[3][2]=(3%2)*2+(2%2)*3 = 2
a[4][1]=(4%2)*1+(1%2)*4 = 4
a[5][0]=(5%2)*0+(0%2)*5 = 0
3. a
Explicație:

Ultima soluție este


(violet, albastru, verde),
1 2 3 4 5
5 4 3 ultima
iar penultima
5 4 2 penultima (violet, albastru, galben)

4. c
Nodul 5 este tată pentru 2, 7, 8
(apare în vectorul de tați pe
pozițiile 2, 7, 8), adică este tată
pentru 3 noduri
5. b
Explicație: arcele (6,2), (6,5)

drumuri între 2 și 4 sunt


2 1 4; 2 5 3 4; 2 6 5 3 4

30
SUBIECTUL al II-lea

a. 1 1 1 2 2 2 3 3
Explicație: Se afișează 8/3=2 grupe de cate 3 valori ale lui t (prima grupă cu 3 valori 1, a doua grupă cu 3 valori 2). In final, după ce s-a
încheiat primul pentru se afișează 8%3=2 valori ale lui t=3
b. 46 50
11111 2222 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

6 6 6 6 6 7 7 7 7 7 8 8 8 8 8 9 9 9 9 9 10 10 10 10 10 11
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
Explicație: Cel mai mic n=9*5+1 (pentru această valoare a lui n, ultima valoare afișată ar fi primul 10 din grupa de valori egale cu 10) iar
cel mai mare este n=10*5. ((pentru această valoare a lui n, ultima valoare afișată ar fi ultimul 10 din grupa de valori egale cu 10)
c. d.
#include <iostream> citește n,k
using namespace std; (numere naturale nenule)
int main() t1
{ int n, k, t=1; ┌pentru i1,[n/k] execută
c>>n>>k; │┌pentru j1,k execută
for(i=1; i<=n/k; i++) ││ scrie t,' '
{ for(j=1; j<=k; j++) │└■
│ tt+1
cout<<t<<’ ’;
└■
t++;
} in%k
for(i=n%k; i>=1; i--) ┌cât timp i>=1 execută
cout<<t<<’ ’; │ scrie t,' '
return 0;} │ ii-1
└■
f(0) = 0
f(2020) = 0+f(101) = 1 + f(5)
= 1 + 5 + f(0) = 6
3
4, 7
Adică sunt 3 componente conexe,
varfurile din componenta cu cele
mai puține noduri sunt 4 și 7

31
SUBIECTUL al III-lea

void impare (int n, int &s)


{int v[10]= {0},i;
s=0;
while(n!=0)
{ if(n%2!=0)
v[n%10]++;
n=n/10;
}
for (i=1; i<=9; i=i+2)
if (v[i]!=0)
s=s+i;
}
Explicație:
Am construit vectorul de frecvențe pentru cifrele impare ale numarului dat ca parametru. Am
parcurs vectorul de frecvențe și am însumat cifrele impare.

#include <iostream>
#include <cstring>
using namespace std;
int main()
char cuv[20][21]; int n,i,k=0;
cin>>n; cin.get();
for(i=1; i<=n; i++)
cin>>cuv[i]; // cin.getline(cuv[i],20);
for(i=1; i<=n-1; i++)
if(strcmp(strstr(cuv[i],cuv[n]), cuv[i])==0)
{ cout<<cuv[i]<<" ";
k++;
}
if (k==0) cout<<"nu exista";
return 0;}

32
a b
#include <iostream>
#include <fstream> În rezolvarea propusă am citit pe rând din
using namespace std; fișier numarul k iar apoi celelalte numere
ifstream f("bac.txt"); (x).
int main() Pentru fiecare numar x citit din fișier am
{int nrsecv,x,k,l=0, lmax=0; verificat divizibilitatea cu k; în caz
f>>k; afirmativ am incrementat lungimea
while(f>>x) secvenței curente ( l ) de numere
{if(x%k==0) divizibile cu k, iar în caz contrar am
l++; actualizat corespunzător lungimea
else maximă (lmax) a unei secvențe de
{if (l>lmax) numere consecutive citite din fișier
{ divizibile cu k, precum și numărul de
lmax=l; secvențe (nrsecv) cu această lungime
nrsecv=1; maximă.
}
else Eficiența rezolvării al timpului de
if(l==lmax) execuție constă în faptul că printr-o
nrsecv++; singură parcurgere a fisierului am
l=0; rezolvat cerința problemei.
}
} Eficieța rezolvării dpdv al memoriei
if (l>lmax) constă în faptul ca am utilizat doar câteva
{ variabile simple (fără tablouri sau alte
lmax=l; tipuri de date structurate)
nrsecv=1;
}
else
if(l==lmax)
nrsecv++;
cout<<lmax<<’ ’<<nrsecv;
f.close();
return 0;
}

33
10
Simulare
REZOLVARE PROPUSĂ DE
PROF. ALINA PINTESCU

SUBIECTUL I (20 de puncte)


Pentru fiecare dintre itemii de la 1 la 5, scrieţi pe foaia de examen litera corespunzătoare
răspunsului corect. Fiecare răspuns corect se notează cu 4 puncte.

Răspuns: d
Obs: x=8 nu merge d. (daca si numai daca)

Răspuns: b

f(19,20) = f(18,21) = f(15,22) = f(8,23) = f(-7,24) = 24

Răspuns: c

Răspuns: a

Răspuns: c

Un subgraf, se obține ştergând eventual anumite vârfuri şi odată cu


acestea şi muchiile care le admit ca extremitate (nu se pot şterge toate
vârfurile deoarece s-ar obține un graf cu mulțimea vârfurilor vidă).

34
SUBIECTUL al II-lea (40 de puncte)

a) Răspuns corect: 60
b) 20 21 Se acordă câte 3p. pentru fiecare dintre cele două numere conform cerinței.
S=10+12+14+16+18+20 =90 pt 20 si 21
a) c) d)
citește x,y
(numere naturale nenule)
┌dacă x>y atunci
| x→y
└■
ix; jy; s0
ss+(i%2)*j+(j%2)*i
ii+1; jj-1
┌cât timp i≤j execută
| ss+(i%2)*j+(j%2)*i
│ ii+1; jj-1
└■
scrie s

struct spectacol
{ int cod, nrActori;
int varsta[10];
}s[20];
M1
for(i=0; i<4; i++)
for(j=0; j<5; j++)
a[i][j]=i*5+5-j;
// a[i][j]=(i+1)*5-j;

M2
for(j=4; j>=0; j--)
{a[0][j]=5-j;
for(i=1; i<=3; i++)
a[i][j]=a[i-
1][j]+5;
}

35
SUBIECTUL al III-lea (30 de puncte)

void produs(int n, int &p)


{ p=1;
int v[10]= {0},ok=0;
while(n)
{if(n%2==0)
{ v[n%10]=1; ok=1; }
n=n/10;
}
for(int c=0; c<9; c=c+2)
if(v[c]>0) p=p*c;
if (ok==0) p = -1;
}

Metoda 1 Metoda 2
#include <iostream>
#include <cstring>
using namespace std;
int i, j, ok, aux;
char s[1024];
int main()
{cin.getline(s,100);
while (s[i]!='\0') {
if (s[i]==' ') {
j=i+1;
while (s[j]>='a'&&s[j]<='z') j++;
if (s[i-1]==s[j-1]) {
ok=1;
aux = strlen(s);
for (j = aux; j>=i; j--)
s[j+7]=s[j];
strcpy(s+i+1, "succes"); s[i+7]=' ';
i+=8;
}
}
i++;
}
if (!ok) cout<<"nu exista";
else cout<<s;
return 0;
}

36
a b
#include <iostream>
#include <fstream> Am citit pe rând numerele din fișier. Am salvat în b
using namespace std; numărul precedent și am citit în variabila a nr curent.
ifstream fin("bac.txt"); Am verificat dacă rația curentă este egală cu rația
int r,rmx,k,lmx,n,a,b; anterioară, iar în caz afirmativ lungimea unui posibil
int main() șir k crește, în caz contrar rația se
{while(fin>>n) modifică/actualizează și lungimea noului șir devine 0.
{b=a; a=n; Dacă lungimea șirului l este mai mare decât o lungime
if(a-b==r) k++; maximă găsită (lmx), atunci actualizăm valoarea
else maximă lmx=k și rația maximă rmx=r.
{r=a-b; k=0;} Dacă lmx=k atunci vom compara rațiile și o vom
if(k>lmx) reține pe cea mai mare.
{lmx=k; rmx=r;} Dacă lungimea șirului l este diferită de 0 vom afișa
if(k==lmx) rmx, în caz contrar se va afișa mesajul ”nu există”
if(r>rmx) rmx=r; deoarece nu s-a găsit un șir conform cerinței.
}
if(k!=0) cout<<rmx; Rezolvarea propusă este eficientă dpdv al memoriei
else cout << "nu exista"; deoarece am folosit un număr minimal de valori
return 0;} posibile (7 variabile simple) și este eficientă dpdv al
timpului de executare deoarece algoritmul este liniar
de complexitate liniară [ O(n) unde n=nr de nr citite] –
adică la o singură parcurgere a valorilor se oferă
soluția dorită.

37
RESURSE WEB

 https://rocnee.eu/modelesubiecte/

 https://www.pbinfo.ro/articole/5546/informatica-in-liceu

LINKUL RESURSEI (auxiliar)

 https://alinapintescu.wordpress.com/c/

*** materialul este gândit ca un Ghid de pregătire a examenului de bacalaureat la


informatică C++ - Sesiunea iunie 2020

38

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