Înapoi la blog
#olimpiadă#OJI#C++#algoritmi

Cum te pregătești eficient pentru Olimpiada Județeană de Informatică (OJI)

Ghid practic pentru OJI: ce nivel cere, teme esențiale pe clase, un plan de antrenament realist, cum exersezi pe arhive și cum gestionezi timpul în concurs.

Te-ai calificat la Olimpiada Județeană de Informatică (OJI) sau vrei să ajungi acolo? Vestea bună e că OJI nu se câștigă cu talent înnăscut, ci cu un antrenament organizat. Hai să vedem exact ce ai de făcut ca să intri în concurs pregătit, nu speriat.

Ce nivel cere, de fapt, OJI

OJI e a doua etapă a olimpiadei, după faza pe școală/locală și înainte de etapa națională. Subiectele sunt mai grele decât la clasă, dar nu imposibile: de obicei primești 2-3 probleme pe care le rezolvi în câteva ore, scriind cod în C++.

Fiecare problemă e evaluată automat pe un set de teste, iar punctajul e proporțional cu câte teste treci. Asta înseamnă două lucruri importante:

  • Nu trebuie să rezolvi totul perfect ca să iei puncte. O soluție parțială, mai lentă, poate lua 30-60 de puncte.
  • Contează enorm să respecți formatul de intrare/ieșire și limitele (timp și memorie).

Mulți elevi buni pierd puncte nu pentru că nu știu algoritmul, ci pentru că au citit greșit enunțul sau au depășit limita de timp. La OJI, atenția la detalii valorează cât un algoritm în plus.

Temele esențiale, pe clase

Programa OJI e structurată pe clase, iar fiecare nivel adaugă peste cel anterior. Iată o hartă orientativă a temelor pe care merită să le stăpânești:

ClasăTeme esențiale
Clasa a V-anumere, cifre, divizibilitate, prelucrări simple
Clasa a VI-așiruri de numere, vectori, parcurgeri, maxim/minim
Clasa a VII-amatrice, prime, algoritmi pe cifre, sortare simplă
Clasa a VIII-acăutare binară, greedy de bază, structuri pe vectori
Clasa a IX-asortări, complexitate, stive/cozi, two pointers
Clasa a X-arecursivitate, backtracking, programare dinamică de bază
Clasa a XI-agrafuri (BFS/DFS), arbori, DP mai avansat
Clasa a XII-agrafuri ponderate, structuri de date, optimizări

Nu te speria de listă. Ideea nu e să le știi pe toate dintr-odată, ci să le acoperi în ordine, temeinic. O temă pe care o înțelegi cu adevărat valorează mai mult decât cinci pe care le-ai văzut o dată.

Un plan de antrenament care chiar funcționează

Pregătirea haotică, în care rezolvi probleme la întâmplare, dă rezultate slabe. Mult mai eficient e un plan pe cicluri scurte. Iată un model de săptămână:

  1. Luni-marți: teorie nouă. Înveți o temă (de exemplu căutarea binară), citești cum funcționează și o implementezi de mână de 2-3 ori.
  2. Miercuri-joi: aplicare. Rezolvi 4-5 probleme pe exact acea temă, de la ușor la greu.
  3. Vineri: probleme mixte. Lucrezi probleme care nu îți spun ce algoritm cer, ca să exersezi recunoașterea tiparului.
  4. Weekend: simulare. O dată pe săptămână, faci un concurs cronometrat cu subiecte vechi de OJI.

Respectă două principii: constanță (o oră pe zi bate 7 ore o dată pe săptămână) și revizuire (revii peste problemele pe care nu le-ai scos, după câteva zile).

O tehnică de care ai mereu nevoie: căutarea binară

Căutarea binară apare la OJI în nenumărate forme, nu doar pentru a găsi un element într-un vector sortat, ci și pentru a "căuta răspunsul" la o problemă. Iată implementarea clasică, scrisă curat, fără capcanele de la mid:

#include <bits/stdc++.h>
using namespace std;

// Caută poziția lui x într-un vector sortat crescător.
// Întoarce indexul (0-based) sau -1 dacă x nu există.
int cautareBinara(const vector<int>& v, int x) {
    int st = 0, dr = (int)v.size() - 1;
    while (st <= dr) {
        int mid = st + (dr - st) / 2;  // evită overflow
        if (v[mid] == x)
            return mid;
        else if (v[mid] < x)
            st = mid + 1;
        else
            dr = mid - 1;
    }
    return -1;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, q;
    cin >> n >> q;
    vector<int> v(n);
    for (int i = 0; i < n; i++)
        cin >> v[i];

    sort(v.begin(), v.end());

    while (q--) {
        int x;
        cin >> x;
        cout << cautareBinara(v, x) << '\n';
    }
    return 0;
}

Observă câteva detalii care fac diferența la concurs:

  • mid = st + (dr - st) / 2 în loc de (st + dr) / 2 previne depășirea de int când valorile sunt mari.
  • ios_base::sync_with_stdio(false) și cin.tie(nullptr) accelerează citirea, esențial când ai sute de mii de valori.
  • Afișezi cu '\n' în loc de endl, fiindcă endl golește buffer-ul de fiecare dată și te poate costa timp.

Stăpânește acest șablon până îl scrii din memorie. La fel procedezi cu BFS, DFS, sortarea proprie de structuri și cu un backtracking de bază.

Cum exersezi pe arhive

Secretul real al pregătirii e să lucrezi pe probleme date deja la OJI și pe platformele de antrenament. Iată cum scoți maximul din ele:

  • Rezolvă pe arhive cronometrat. Pe site-uri ca pbinfo, infoarena sau Kilonova găsești enunțuri OJI din anii trecuți. Pune-ți cronometru și simulează condiții reale.
  • Citește editorialele după ce încerci. Mai întâi te chinui singur 30-40 de minute. Abia apoi citești soluția. Dacă te uiți prea repede, nu înveți să gândești.
  • Ține un caiet de greșeli. Notează ce ai ratat: ai uitat un caz limită? Ai depășit timpul? Ai citit greșit enunțul? Peste o lună, caietul ăsta îți arată exact unde să insiști.
  • Reimplementează problemele grele. Dacă o problemă te-a învins, după câteva zile o scrii din nou de la zero, fără să te uiți la soluție.

Ținta sănătoasă e să rezolvi complet (sau aproape) între 100 și 200 de probleme până la concurs, acoperind toate temele clasei tale.

Cum gestionezi timpul în concurs

Strategia din ziua concursului contează aproape la fel de mult ca pregătirea. Iată un plan simplu:

  1. Citește toate problemele întâi (5-10 minute). Îți faci o idee despre dificultate.
  2. Începe cu cea mai ușoară, nu cu prima din enunț. Iei puncte sigure de la început și prinzi încredere.
  3. Scrie o soluție de "brut" dacă te blochezi. O soluție simplă, chiar lentă, îți poate aduce testele mici. E mai bine decât zero.
  4. Testează pe exemplul din enunț înainte de a trimite. Și gândește-te la cazuri limită: n = 0, valori egale, vectorul gol.
  5. Lasă timp de verificare la final (10-15 minute). Verifică formatul de ieșire și că nu ai uitat un endl sau un caz.

Nu te ambiționa pe o singură problemă până la epuizare. Dacă ai stat 40 de minute fără progres, treci la alta și revii.

Concluzie

Pregătirea pentru OJI nu e o cursă de viteză, ci una de rezistență: teorie pe clase, antrenament constant, probleme de pe arhive și o strategie clară în concurs. Dacă lucrezi organizat câteva luni, rezultatul vine aproape de la sine.

La ByteSchool te pregătim pentru olimpiadă alături de mentori care au fost ei înșiși olimpici și care lucrează acum în tech. Îți construim un plan pe clasa și nivelul tău, îți dăm probleme selectate și îți corectăm soluțiile pas cu pas — ca să ajungi la OJI nu doar calificat, ci pregătit.