Enunțul problemei grad, de clasa a 7-a, dată în 2009 la OJI, se găsește pe .campion.

Rezumat grad

Se dă un șir de caractere de lungime n. Acest șir conține doar spații și litere mici ale alfabetului englez. Textul conține mai multe cuvinte, separate prin unul sau mai multe spații. Fiecare literă a alfabetului are asociat un cod egal cu poziția ei în alfabet. Gradul unui cuvânt este egal cu suma codurilor literelor din componența sa.

Cuvintele vor alcătui mai multe grupe, astfel încât cuvintele cu același grad să se afle în aceeași grupă. Se cere să afișăm numărul de cuvinte din text, precum și numărul de grupe ce se pot forma cu aceste cuvinte.

Soluție grad

Am notat numărul de cuvinte cu a și numărul de grupe cu b. Am citit n-ul, care este total inutil, pentru că ne-am complica dacă am citit textul caracter cu caracter. În schimb, deoarece cuvintele sunt separate prin spații, am ales să citesc fiecare cuvânt în string-ul str, cât timp fișierul mai conține caractere care nu sunt albe. Adică, am folosit while (fin >> str).

Apoi, am parcurs caracterele lui str pentru a calcula gradul cuvântului. Pentru fiecare literă am adăugat la variabila grad valoarea str[i] - 'a' + 1, pentru că într-o astfel de expresie, str[i] reprezintă de fapt codul ASCII al caracterului respectiv. Cum în codul ASCII literele se regăsesc pe poziții consecutive, în ordinea din alfabet, dacă din str[i] scădem codul lui 'a', obținem poziția literei din alfabet (începând de la 0). Dar, în problemă pozițiile sunt numerotate de la 1, de aceea am adunat și eu 1 la expresie.

Am folosit un vector caracteristic frq, unde frq[i] este true dacă și numai dacă există măcar un cuvânt cu gradul i în textul dat. Gradul maxim pe care îl poate avea un cuvânt este egal cu lungimea sa maximă (n-ul maxim), înmulțită cu codul maxim al unei litere (26). Deci, lungimea cu care se declară vectorul, pe care am notat-o cu GMAX, trebuie să fie minim 6630 + 1.

După calcularea gradului unui anumit cuvânt, actualizez valoarea lui frq[grad]. La final, parcurg vectorul frq, iar pentru fiecare element cu valoarea true, îl incrementez pe b, pentru că am identificat o nouă grupă. Apoi, pot afișa valorile variabilelor a și b.

Sursă C++ grad

Dacă ai vreo nedumerire cu privire la problema grad, lasă un comentariu și te voi ajuta 🙂

Îți place conținutul acestui site?

Dacă vrei să mă susții în întreținerea server-ului și în a scrie mai multe articole de calitate pe acest blog, mă poți ajuta printr-o mică donație. Află aici cum o poți face!