Sari la conținut

Bac informatică 2026 Varianta 3, rezolvată

Varianta 3 de la Bacalaureatul la Informatică (Mate-Info, C/C++): conține 3 subiecte (90 de puncte) și are un timp de lucru de 3 ore. Sub fiecare exercițiu găsești răspunsul corect și rezolvarea.

Subiecte oficiale publicate de Ministerul Educației. Rezolvări realizate de subac. Actualizat la .

📌 Despre Varianta 3 din 2026

Varianta 3 din 2026 trece prin paritate, recursivitate, structuri, grafuri orientate și neorientate, backtracking, matrice, cifre, șiruri de caractere și fișiere. Este o variantă echilibrată, bună pentru recapitularea întregii materii.

Subiectul I (20p): 5 grile: o expresie care verifică dacă două numere au aceeași paritate, apelul recursiv care lipsește dintr-un subprogram care caută un divizor, al 10-lea termen al unei progresii aritmetice memorate într-o structură progresie, gradele interne și externe ale unui graf orientat dat prin matricea de adiacență și numărul maxim de muchii adăugate ca un graf să devină eulerian.

Subiectul al II-lea (40p): Un algoritm în pseudocod care adună sau scade valori citite după comparația cu cel mai mare număr de până atunci, o problemă de backtracking cu seturi de materiale de promovare și o secvență care completează o matrice 5×5 în șerpuire, pe coloane.

Subiectul al III-lea (30p): Un subprogram cu cifre (ImparPar, care pune cifrele impare înaintea celor pare, fiecare grup în ordinea din număr), o problemă cu șiruri de caractere care verifică dacă vocalele și consoanele unui cuvânt alternează și o problemă de eficiență care numără rezultatele „motivante” la șah și la go, citite din fișierul bac.txt.

⚠️ La ce să fii atent

  • La I.4: Calculează ambele grade pentru fiecare vârf: gradul extern este suma liniei, iar cel intern suma coloanei. Toate gradele interne sunt 2, iar diferența este 1 doar la vârfurile 2 și 3.
  • La II.1.a: Când y este egal cu x, valoarea se scade, chiar dacă suma devine negativă: după cele două valori 5, s ajunge -2. La final se afișează 5.
  • La II.2: Un set poate avea și una sau două elemente, deci fiecare prefix valid este el însuși o soluție. După (broșură, revistă) nu mai urmează nimic cu broșură, iar a șaptea soluție este (ghid).
  • La III.1: Cifrele pare și cele impare își păstrează ordinea din n. Pentru 19472 obții 197 și 42, apoi le lipești: 19742.
  • La III.3: Fiecare poziție se compară cu cea de la concursul anterior de același tip, nu cu linia de dinainte. Primul concurs de fiecare tip nu se numără, iar o poziție egală cu cea anterioară nu este un rezultat motivant.

Subiectul I

20 de puncte
  1. Exercițiul 1 4p Expresii și operatori

    Variabilele x și y sunt întregi.

    Indicați o expresie C/C++ care are valoarea 1 dacă și numai dacă numerele naturale memorate în variabilele x și y au aceeași paritate.

    • a)(x*y)%2==0
    • b)x%2==0 && y%2==0
    • c)(x+y)%2==0
    • d)!(x%2==y%2)
    Vezi rezolvarea

    Răspuns corect: c) (x+y)%2==0

    Suma a două numere este pară exact atunci când cele două numere au aceeași paritate — deci (x+y)%2==0 e adevărată doar când x și y sunt ambele pare sau ambele impare.

  2. Exercițiul 2 4p Recursivitate

    Subprogramul alăturat, f, este incomplet definit.

    Indicați expresia cu care pot fi înlocuite punctele de suspensie, astfel încât, în urma apelului de mai jos, să se afișeze 7.

    f(35,17);

    void f(int n, int d)
    { if(n%d==0)
        cout<<d; | printf("%d",d);
      else f(........);
    }
    • a)n+1,d+1
    • b)n-1,d-1
    • c)n,d+1
    • d)n,d-1
    Vezi rezolvarea

    Răspuns corect: d) n,d-1

    La fiecare apel d scade cu 1 până devine un divizor al lui n. Pornind de la d=17, primul divizor al lui 35 întâlnit coborând este 7.

  3. Exercițiul 3 4p Tipul înregistrare (struct)

    Variabila p, declarată alăturat, memorează primul termen și rația unei progresii aritmetice.

    Știind că diferența dintre un termen al progresiei și termenul anterior este egală cu rația, indicați expresia a cărei valoare este egală cu cel de al 10-lea termen al progresiei.

    struct progresie
    {  int prim;
       int ratie;
    }p;
    • a)prim.p+ratie.p*9
    • b)p.prim+9*p.ratie
    • c)progresie.prim.p+9*progresie.ratie.p
    • d)p.progresie.prim+9*p.progresie.ratie
    Vezi rezolvarea

    Răspuns corect: b) p.prim+9*p.ratie

    Al n-lea termen al unei progresii aritmetice este prim + (n-1) · rație. Pentru n=10, expresia corectă e p.prim + 9*p.ratie.

  4. Exercițiul 4 4p Grafuri orientate

    Un graf orientat cu 5 vârfuri, numerotate de la 1 la 5, este reprezentat prin matricea de adiacență alăturată.

    Indicați numărul de vârfuri ale grafului cu proprietatea că valoarea absolută a diferenței gradelor intern și extern este 1.

    01001
    10000
    11010
    00101
    00110
    • a)2
    • b)3
    • c)4
    • d)5
    Vezi rezolvarea

    Răspuns corect: a) 2

    Fiecare vârf are gradul intern egal cu 2. Gradele externe sunt 2,1,3,2,2 — doar vârfurile 2 și 3 au |intern − extern| = 1, deci răspunsul este 2.

  5. Exercițiul 5 4p Grafuri neorientate

    Un graf neorientat cu 6 noduri, numerotate de la 1 la 6, este reprezentat alăturat.

    Indicați numărul maxim de muchii care pot fi adăugate, astfel încât graful obținut să fie eulerian.

    Graf neorientat cu 6 noduri și muchiile [1,2], [1,3], [1,5], [2,3], [3,6] și [5,6]. Nodul 4 nu are nicio muchie.
    • a)9
    • b)6
    • c)3
    • d)2
    Vezi rezolvarea

    Răspuns corect: b) 6

    Nodul 4 e izolat, iar vârfurile 1 și 3 au grad impar. Legând 4 de restul grafului și corectând paritatea tuturor vârfurilor se pot adăuga cel mult 6 muchii păstrând graful simplu, conex și cu toate gradele pare.

Subiectul al II-lea

40 de puncte
  1. Exercițiul 1.a 6p Algoritmi în pseudocod

    Se consideră algoritmul alăturat, reprezentat în pseudocod.

    Scrieți valoarea afișată dacă se citesc, în această ordine, numerele 8, 3, 1, 5, 2, 4, 5, 5, 7.

    citește n
       (număr natural nenul)
     s←0; x←0; p←1
    ┌repetă
    │ citește y (număr natural nenul)
    │┌dacă y>x atunci
    ││ s←s+y; x←y
    ││altfel
    ││┌dacă x=y atunci s←s-y
    ││└■
    │└■
    │ p←p+1
    └până când p>n
    scrie s
    Vezi rezolvarea

    Răspunsul din barem: 5

    n=8, deci se citesc 8 valori. Pornim cu s=0, x=0: y=3 → 3>0, deci s=3, x=3 y=1 → nici mai mare, nici egal cu x: nimic y=5 → 5>3, deci s=8, x=5 y=2 → nimic y=4 → 4<5 și 4≠5: nimic y=5 → x=y, deci s=8-5=3 y=5 → x=y, deci s=3-5=-2 y=7 → 7>5, deci s=-2+7=5, x=7 Se afișează 5.

  2. Exercițiul 1.b 6p Algoritmi în pseudocod

    Același algoritm ca la 1.a.

    Dacă pentru n se citește numărul 3, scrieți un set de date care pot fi citite în continuare, astfel încât, în urma executării algoritmului, să se afișeze 0.

    Vezi rezolvarea

    Exemplu: 4 4 2

    Se acceptă orice set de trei numere naturale nenule de forma x, x, y sau x, y, x cu y<x. Pentru 4 4 2: y=4 > x=0 → s=4, x=4; y=4 = x → s=4-4=0; y=2 e mai mic decât x și diferit de el → s rămâne 0.

  3. Exercițiul 1.c 10p Algoritmi în pseudocod

    Același algoritm ca la 1.a.

    Scrieți programul C/C++ corespunzător algoritmului dat.

    Vezi rezolvarea
    #include <iostream>
    using namespace std;
    
    int main()
    {
        int n, y, s = 0, x = 0, p = 1;
        cin >> n;
        do
        {
            cin >> y;
            if (y > x) { s = s + y; x = y; }
            else if (x == y) s = s - y;
            p = p + 1;
        } while (p <= n);
        cout << s;
        return 0;
    }

    repetă…până când p>n se traduce prin do…while cu condiția negată (p<=n): structura se execută cel puțin o dată, iar testul se face la final.

  4. Exercițiul 1.d 6p Algoritmi în pseudocod

    Același algoritm ca la 1.a.

    Scrieți în pseudocod un algoritm, echivalent cu cel dat, înlocuind structura repetitivă cu o structură de tip pentru...execută.

    Vezi rezolvarea
    citește n (număr natural nenul)
    s←0; x←0
    ┌pentru p←1,n execută
    │ citește y (număr natural nenul)
    │┌dacă y>x atunci
    ││ s←s+y; x←y
    ││altfel
    ││┌dacă x=y atunci s←s-y
    ││└■
    │└■
    └■
    scrie s

    Contorul p nu se mai inițializează și nu se mai incrementează manual — de asta se ocupă structura pentru — iar condiția de oprire p>n devine limita finală n.

  5. Exercițiul 2 6p Backtracking

    Utilizând metoda backtracking se generează toate seturile de câte cel mult trei materiale de promovare turistică din mulțimea ordonată {broșură, ghid, pliant, revistă}, astfel încât din același set să nu facă parte simultan un pliant și o revistă. Două seturi sunt distincte dacă diferă prin cel puțin un material. Primele cinci soluții generate sunt, în această ordine:

    1. (broșură)
    2. (broșură, ghid)
    3. (broșură, ghid, pliant)
    4. (broșură, ghid, revistă)
    5. (broșură, pliant)

    Scrieți a șasea și a șaptea soluție generată.

    Vezi rezolvarea

    Răspunsul din barem: (broșură, revistă) (ghid)

    (broșură, revistă) (ghid)

    După (broșură, pliant) ar urma (broșură, pliant, revistă), dar pliantul și revista nu pot sta în același set. Se trece la (broșură, revistă) — a șasea. Seturile care încep cu broșura se termină aici (mai departe nu mai există material după revistă), deci urmează primul set care începe cu ghid: (ghid).

  6. Exercițiul 3 6p Tablouri bidimensionale

    Variabilele i și j sunt de tip întreg, iar variabila a memorează un tablou bidimensional cu 5 linii și 5 coloane, numerotate de la 0 la 4, având inițial toate elementele nule.

    Fără a utiliza alte variabile, scrieți secvența C/C++ de mai jos, înlocuind punctele de suspensie cu instrucțiuni adecvate, dintre care cel mult patru atribuiri, astfel încât, în urma executării secvenței obținute, tabloul memorat în variabila a să aibă elementele alăturate.

    for(i=0;i<5;i++)
      for(j=0;j<5;j++)
       ..................
    09101920
    18111821
    27121722
    36131623
    45141524
    Vezi rezolvarea
    for(i=0;i<5;i++)
      for(j=0;j<5;j++)
        if(j%2==0) a[i][j]=5*j+i;
        else a[i][j]=5*j+4-i;

    Tabloul se completează pe coloane, în șerpuire: coloana j conține valorile de la 5*j la 5*j+4. Pe coloanele pare (0, 2, 4) valorile cresc de sus în jos, deci a[i][j]=5*j+i; pe cele impare (1, 3) cresc de jos în sus, deci a[i][j]=5*j+4-i. Sunt două atribuiri, sub limita de patru.

Subiectul al III-lea

30 de puncte
  1. Exercițiul 1 10p Subprograme

    Numim număr uniform asociat unei valori naturale numărul obținut din aceasta prin eliminarea fie a tuturor cifrelor sale pare, fie a tuturor cifrelor sale impare.

    Exemplu: lui 19472 i se asociază numerele uniforme 197 și 42.

    Subprogramul ImparPar are un singur parametru, n, prin care primește un număr natural cu toate cifrele nenule (n∈[11,10^9)), având cel puțin o cifră pară și cel puțin o cifră impară. Subprogramul returnează un număr obținut din cifrele numărului uniform impar asociat lui n, urmate de cifrele numărului uniform par asociat lui n, ca în exemplu.

    Scrieți definiția completă a subprogramului.

    Exemplu: dacă n=19472, subprogramul returnează numărul 19742.

    Vezi rezolvarea
    int ImparPar(int n)
    {
        int imp = 0, par = 0, pi = 1, pp = 1, c;
        while (n != 0)
        {
            c = n % 10;
            if (c % 2 == 1)
            {
                imp = imp + c * pi; pi = pi * 10;
            }
            else
            {
                par = par + c * pp; pp = pp * 10;
            }
            n = n / 10;
        }
        return imp * pp + par;
    }

    Cifrele se parcurg de la dreapta la stânga. Fiecare cifră impară se adaugă în fața numărului imp (pi ține puterea lui 10 la care a ajuns), iar fiecare cifră pară în fața lui par (cu pp). Așa, în fiecare dintre cele două numere, cifrele rămân în ordinea din n. La final cifrele lui par se lipesc după cele ale lui imp: imp * pp mută imp la stânga cu atâtea cifre câte are par. Pentru 19472: imp = 197, par = 42, pp = 100, deci 197 * 100 + 42 = 19742.

  2. Exercițiul 2 10p Șiruri de caractere

    Scrieți un program C/C++ care citește de la tastatură un cuvânt format din cel puțin două și cel mult 100 de caractere, numai litere mici ale alfabetului englez, și afișează pe ecran mesajul alterneaza, dacă în text nu există două vocale sau două consoane pe poziții consecutive, sau mesajul nu alterneaza, în caz contrar.

    Exemplu: pentru cuvintele imunopolizaharide sau pas se afișează mesajul alterneaza iar pentru cuvântul aer se afișează mesajul nu alterneaza

    Vezi rezolvarea
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main()
    {
        char s[101];
        int i, ok = 1;
        cin >> s;
        for (i = 0; s[i + 1] != '\0'; i++)
            if ((strchr("aeiou", s[i]) != NULL) == (strchr("aeiou", s[i + 1]) != NULL))
                ok = 0;
        if (ok) cout << "alterneaza";
        else cout << "nu alterneaza";
        return 0;
    }

    Se compară fiecare literă cu următoarea. strchr("aeiou", litera) spune dacă litera e vocală; dacă două litere vecine sunt amândouă vocale sau amândouă consoane, cele două comparații dau același rezultat și cuvântul nu alternează. Bucla se oprește când s[i + 1] e sfârșitul șirului, deci ultima pereche verificată este penultima și ultima literă.

  3. Exercițiul 3.a 2p Algoritmi eficienți

    De-a lungul timpului, o persoană a participat la mai multe concursuri de șah și de go. Un rezultat motivant corespunde unei poziții mai bune (cu un număr mai mic) în clasamentul unui concurs, comparativ cu poziția obținută la concursul anterior de același tip.

    Fișierul bac.txt conține un șir de cel mult 10^4 numere naturale, reprezentând rezultatele obținute la concursurile la care a participat, în ordine cronologică: pentru fiecare dintre rezultate, câte o pereche formată din poziția ocupată în clasamentul concursului corespunzător (un număr din intervalul [1,300]), urmată de valoarea 1, dacă acesta a fost concurs de șah, sau de valoarea 2, dacă acesta a fost concurs de go. Fiecare pereche se află pe câte o linie a fișierului, cu valorile separate printr-un spațiu.

    Se cere să se afișeze pe ecran, separate printr-un spațiu, două valori naturale, reprezentând, în această ordine, numărul de rezultate motivante obținute la concursurile de șah, respectiv la cele de go. Proiectați un algoritm eficient din punctul de vedere al timpului de executare și al spațiului de memorie utilizat.

    Exemplu: dacă fișierul conține numerele alăturate, pe ecran se afișează 3 2 pentru că la șah a obținut trei rezultate motivante (poziția 3 după poziția 7, poziția 1 după poziția 5 și poziția 1 după poziția 2), iar la go două rezultate motivante (poziția 5 după poziția 8, poziția 1 după poziția 5).

    61
    82
    71
    52
    31
    41
    51
    12
    42
    11
    21
    11

    Descrieți în limbaj natural algoritmul proiectat, justificând eficiența acestuia.

    Vezi rezolvarea

    Timp de executare: O(n) · Memorie: O(1)

    Datele se prelucrează pe măsura citirii, pereche cu pereche, fără să fie memorate. Se păstrează doar poziția de la ultimul concurs de șah (ups) și de la ultimul concurs de go (upg), ambele pornite de la -1, plus cele două numărări, ns și ng, pornite de la 0.

    Pentru fiecare pereche citită (p, c): dacă c = 1, se crește ns când p < ups, apoi ups devine p; dacă c = 2, se face la fel cu ng și upg. Valoarea inițială -1 face ca primul concurs de fiecare tip să nu fie numărat, pentru că nicio poziție nu e mai mică decât -1. La final se afișează ns și ng.

    Eficiență: fiecare pereche se citește și se prelucrează o singură dată, în timp constant, deci algoritmul este liniar în numărul de valori din fișier. Se folosesc doar câteva variabile simple, fără tablou, deci memoria folosită este constantă.

  4. Exercițiul 3.b 8p Algoritmi eficienți

    De-a lungul timpului, o persoană a participat la mai multe concursuri de șah și de go. Un rezultat motivant corespunde unei poziții mai bune (cu un număr mai mic) în clasamentul unui concurs, comparativ cu poziția obținută la concursul anterior de același tip.

    Fișierul bac.txt conține un șir de cel mult 10^4 numere naturale, reprezentând rezultatele obținute la concursurile la care a participat, în ordine cronologică: pentru fiecare dintre rezultate, câte o pereche formată din poziția ocupată în clasamentul concursului corespunzător (un număr din intervalul [1,300]), urmată de valoarea 1, dacă acesta a fost concurs de șah, sau de valoarea 2, dacă acesta a fost concurs de go. Fiecare pereche se află pe câte o linie a fișierului, cu valorile separate printr-un spațiu.

    Se cere să se afișeze pe ecran, separate printr-un spațiu, două valori naturale, reprezentând, în această ordine, numărul de rezultate motivante obținute la concursurile de șah, respectiv la cele de go. Proiectați un algoritm eficient din punctul de vedere al timpului de executare și al spațiului de memorie utilizat.

    Exemplu: dacă fișierul conține numerele alăturate, pe ecran se afișează 3 2 pentru că la șah a obținut trei rezultate motivante (poziția 3 după poziția 7, poziția 1 după poziția 5 și poziția 1 după poziția 2), iar la go două rezultate motivante (poziția 5 după poziția 8, poziția 1 după poziția 5).

    61
    82
    71
    52
    31
    41
    51
    12
    42
    11
    21
    11

    Scrieți programul C/C++ corespunzător algoritmului proiectat.

    Vezi rezolvarea
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        ifstream fin("bac.txt");
        int p, c, ups = -1, upg = -1, ns = 0, ng = 0;
        while (fin >> p >> c)
        {
            if (c == 1)
            {
                if (p < ups) ns++;
                ups = p;
            }
            else
            {
                if (p < upg) ng++;
                upg = p;
            }
        }
        fin.close();
        cout << ns << ' ' << ng;
        return 0;
    }

    Programul face exact pașii de la 3.a: citește perechi până la sfârșitul fișierului și compară fiecare poziție cu cea de la concursul anterior de același tip. O poziție egală cu cea anterioară nu e un rezultat motivant, de aceea comparația este strictă (p < ups).

Vrei să vezi ce notă ai lua la examen?

Intră în modul simulare: ai cronometru de 3 ore, codul ți se compilează pe loc, iar la final primești nota conform baremului.

Începe simularea3 ore

Ai găsit o problemă sau ai o idee?

Despre ce este vorba?