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:

  1. Numarul cifrelor scrise pe tablita de Tandala;
  2. Ce-a de-a K-a cifra de pe tablita, ın ordine de la stanga la dreapta;
  3. 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. 1 <= N <= 100000 si 1 <= K <= 900000; Se garanteaza ca exista cel putin K cifre scrise pe tablita.
  2. 1 <= P <= 18; Se garanteaza ca exista cel putin P cifre scrise pe tablita.
  3. toate numere dictate de Pacala sunt nenule si au cel mult 9 cifre fiecare.
  4. 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.

Ma numesc Sebastian, am 10 ani si sunt pasionat de: programare in Python, C++, Raspberry Pi, citit, astronomie, astrofizica, chimie, sport, fotografie si Xbox. Ma gasesti si pe: Instagram, Youtube, Facebook

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *