Olimpiada Judeteana de Informatica 2022. Rezolvare problema „Ceas” in C++, clasa a V-a

Mai jos veti gasi problema „Ceas” data la Olimpiada Judeteana de Informatica in anul 2022 la clasa a V-a, iar dupa textul problemei veti gasi si rezolvarea mea.

Problema Ceas:

Un atelier de fabricat ceasuri cu cuc are nevoie de placute cu numerele pentru orele pe care trebuie sa le aseze pe discul ceasurilor. Aceste numere sunt realizate la o imprimanta.
Din cauza unei erori imprimanta tipareste placute cu numere naturale, unele mai mari ca 12. Atelierul poate utiliza doar placute cu numere cuprinse intre 0 si 12. Pentru a utiliza aceste numere este nevoie ca ele sa fie taiate incepand din partea dreapta in grupuri de maxim 2 cifre, fiecare grup reprezentand valoarea de pe o placuta, care sa fie o cifra la 0 la 9 sau unul dintre numerele 10, 11, 12. Daca pe o placuta se gaseste un numar mai mare ca 12 atunci placuta trebuie taiata, astfel incat in urma taierii sa se obtina numere de cel mult 2 cifre. Daca in numarul de pe o placuta cifra zecilor este 0, atunci la prima taiere se ia doar cifra unitatilor, altfel daca numarul format cu cifra zecilor si unitatilor este mai mare ca 12, atunci se taie prima data cifra unitatilor, iar daca numarul format cu cifra zecilor si unitatilor este 10, 11 sau 12 se taie prima data numarul format din ultimele 2 cifre, apoi procedeul se repeta pana la taierea completa a placutei. Imprimanta a realizat N placute. De exemplu daca placuta este 12030, dupa taiere se obtin 0, 3, 0, 12.

Cerinte:

  1. Determinati numarul total de aparitii ale cifrei X pe placute inainte de taiere.
  2. Determinati numarul de taieturi realizate conform enuntului.

Date de intrare:

Pe prima linie a fisierului ceas.in se afla valorile C, X si N separate prin cate un singur spatiu. Pe linia a doua se afla N numere naturale separate prin cate un singur spatiu, avand semnificatia din enunt. Pentru C = 1 se rezolva doar cerinta 1, iar pentru C = 2 se rezolva doar cerinta 2.

Date de iesire: 

Fisierul ceas.out contine pe prima linie un singur numar natural care reprezinta valoarea calculata conform cerintei.

Restrictii si precizari:

  1. 1 <= N <= 100.000
  2. 0 <= X <= 9
  3. Valorile din sir sunt numere naturale & 50.000
  4. Pentru testele ın care avem C=2 valoarea X este prezenta ın fisierul de intrare chiar daca nu este folosita ın rezolvare.
  5. Pentru teste ın valoare de 39 de puncte avem C = 1
  6. Pentru teste ın valoare de 61 de puncte avem C = 2

Exemplul 1:

ceas.in:
1 0 6
1010 40 201 5123 31 6

ceas.out:
4

Explicatii:

Pe placute cifra 0 apare de patru ori.


Exemplul 2:

ceas.in:
2 0 6
1010 40 201 5123 31 6

ceas.out:
7

Explicatii:

In ordinea taierilor se obtin: 0,12; 0,4; 1,0,2; 3,12,5; 1,3; 6. Numarul de taieturi este 7.


Mai jos veti gasi metoda mea de rezolvare a problemei:

#include <fstream>
#include <iostream>

int $task, $dig, $numbers, $curr_number, $task1, $task2;

std::ifstream fin("ceas.in");
std::ofstream fout("ceas.out");

using namespace std;

void read() {
	fin >> $task >> $dig >> $numbers;
}

void task1() {
	for (int i = 0; i < $numbers; i++) {
		fin >> $curr_number;
		cout << $curr_number << " ";
		if ($curr_number == $dig){
			$task1++;
		} else {
			while ($curr_number != 0) {
				if ($curr_number % 10 == $dig) $task1++;
				$curr_number /= 10;
			}
		}
	}
	fout << $task1;
}

void task2() {
	for (int i = 0; i < $numbers; i++) {
		fin >> $curr_number;
		cout << $curr_number << " ";
		if ($curr_number < 9 && $curr_number > 0){
			$task2++;
		} else {
			while ($curr_number != 0) {
				if ($curr_number % 100 == 10 || $curr_number % 100 == 11 || $curr_number % 100 == 12) {
					$task2++; $curr_number /= 100;
				} else {
					$task2++; $curr_number /= 10;
				}
			}
		}
	}
	fout << $task2;
}

int main() {
	read();
	cout << $task << " " << $dig << " " << $numbers << endl;
	if ($task == 1) {
		task1();
	} else if ($task == 2) {
		task2();
	}
	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 *