Olimpiada Judeteana de Informatica 2019. Rezolvare problema „Aur” in C++, clasa a V-a
Mai jos veti gasi problema „Aur” data la Olimpiada Judeteana de Informatica in anul 2019 la clasa a V-a, iar dupa textul problemei veti gasi si rezolvarea mea.
Problema Aur:
Dupa ce au mers impreuna prin lume, Pacala si Tandala au strans o caruta plina de banuti de aur, iar acum ii rastoarna pe toti in curtea casei si ii impart in N gramezi. Pacala numara banutii din fiecare gramada si ii dicteaza lui Tandala N numere naturale pe care acesta trebuie sa le scrie in ordine pe o tablita. Dupa ore bune de munca, Pacala constata ca Tandala a scris pe un singur rand, in ordine, de la stanga la dreapta, toate numerele dictate de el, dar lipite unul de altul. Acum pe tablita e doar un sir lung de cifre. Ce sa faca Pacala acum?
Cerinte:
Cunoscand cele N numere naturale dictate de Pacala, scrieti un program care sa determine:
- Numarul cifrelor scrise pe tablita de Tandala;
- Ce-a de-a K-a cifra de pe tablita, ın ordine de la stanga la dreapta;
- Cel mai mare numar ce se poate forma cu exact P cifre alaturate de pe tablita, considerate ın ordine de la stanga la dreapta.
Date de intrare:
Fisierul aur.in contine:
– pe prima linie un numar natural C care reprezinta numarul cerintei si poate avea valorile 1, 2 sau 3.
– pe cea de-a doua linie un numar natural N daca cerinta este 1, sau doua numere naturale N si K (despartite printr-un spatiu) daca cerinta este 2, sau doua numere naturale N si P (despartite printr-un spatiu) daca cerinta este 3.
– pe cea de-a treia linie, N numere naturale despartite prin cate un spatiu, ce reprezinta, ın ordine, numerele pe care Pacala i le dicteaza lui Tandala.
Date de iesire:
Fisierul aur.out va contine pe prima linie un singur numar natural ce reprezinta rezultatul determinat conform fiecarei cerinte.
Restrictii si precizari:
- 1 <= N <= 100000 si 1 <= K <= 900000; Se garanteaza ca exista cel putin K cifre scrise pe tablita.
- 1 <= P <= 18; Se garanteaza ca exista cel putin P cifre scrise pe tablita.
- toate numere dictate de Pacala sunt nenule si au cel mult 9 cifre fiecare.
- Pentru rezolvarea corecta a primei cerinte se acorda 20 de puncte, pentru rezolvarea corecta a celei de-a doua cerinte se acorda 30 de puncte, iar pentru rezolvarea corecta a celei de-a treia cerinte se acorda 40 de puncte.
Exemplul 1:
aur.in:
1
7
25 9 13 459 2 79 9
aur.out:
12
Explicatii:
Se rezolva cerinta 1.
Tandala a scris pe tablita: 259134592799. Numarul cifrelor scrise de Tandala este 12.
Exemplul 2:
aur.in:
2
7 10
25 9 13 459 2 79 9
aur.out:
7
Explicatii:
Se rezolva cerinta 2.
N are valoarea 7 si K are valoarea 10. Pe tablita este scris: 259134592799. Cea de-a zecea cifra este 7.
Exemplul 3:
aur.in:
3
7 4
25 9 13 459 2 79 9
aur.out:
9279
Explicatii:
Se rezolva cerinta 3.
N are valoarea 7 si P are valoarea 4. Tandala a scris pe tablita: 259134592799. Cel mai mare numar format din patru cifre este 9279.
Mai jos veti gasi metoda mea de rezolvare a problemei:
#include <fstream> unsigned long long task, numberonumbers, counter_task1, digitIndex, maximum_task3, x, y, pow10; char currentDigit, digit_task2; using namespace std; ifstream fin("aur.in"); ofstream fout("aur.out"); int main() { int task; fin >> task; if (task == 1) { int numberonumbers, counter_task1 = 0; char currentDigit; fin >> numberonumbers; while (fin >> currentDigit) if (currentDigit != ' ') counter_task1++; fout << counter_task1; } if (task == 2) { int numberonumbers, digitIndex, counter_task1 = 0; char currentDigit, digit_task2; fin >> numberonumbers >> digitIndex; while (fin >> currentDigit) { if (currentDigit != ' ') counter_task1++; if (counter_task1 == digitIndex) digit_task2 = currentDigit; } fout << digit_task2; } if (task == 3) { unsigned long long numberonumbers, digitIndex, maximum_task3 = 0, x, y = 0, counter_task1 = 0; char currentDigit; fin >> numberonumbers >> digitIndex; unsigned long long pow10 = 1; for (int i = 1; i < digitIndex; i++) pow10 = pow10 * 10; while (fin >> currentDigit) { if (currentDigit != ' ') { x = (int) currentDigit - 48; y = y * 10 + x; } counter_task1++; if (counter_task1 == digitIndex) { if (y > maximum_task3) maximum_task3 = y; y = y % pow10; counter_task1--; } } fout << maximum_task3; } return 0; }
Sper sa va fie de folos. 😉
Daca aveti intrebari, va rog sa lasati un mesaj mai jos in comentarii.
Author: Sebastian Chetroni
Website: https://zcoder.ro
Articole recente
- Olimpiada Nationala de Informatica 2023. Rezolvare problema „Cadouri” in C++, clasa a V-a
- Olimpiada Nationala de Informatica 2023. Rezolvare problema „Patinaj” in C++, clasa a V-a
- Olimpiada Judeteana de Informatica 2018. Rezolvare problema „Forus” in C++, clasa a V-a
- Olimpiada Judeteana de Informatica 2018. Rezolvare problema „Patrate” in C++, clasa a V-a
- Olimpiada Judeteana de Informatica 2019. Rezolvare problema „Cartele” in C++, clasa a V-a
Comentarii recente