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

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

Problema Patrate:

Un elev a desenat un set format din mai multe patrate care cont¸in numere naturale nenule, distincte, consecutive, dispuse in numar egal pe laturi. Pe latura fiecarui patrat sunt scrise un numar impar de valori. In fiecare patrat, numerele sunt scrise in ordine crescatoare parcurgand laturile sale, incepand din colt¸ul stanga-jos, in sensul invers al acelor de ceasornic. Elevul a numerotat patratele cu 1, 2, 3 etc., in ordinea strict crescatoare a numarului de valori cont¸inute de fiecare. Diferent¸a dintre cel mai mic numar din patratul P(1-P) si cel mai mare numar din patratul P – 1 este egala cu 1.

Primele patru patrate sunt:

Astfel, primul patrat contine numerele naturale distincte consecutive de la 1 la 8, dispuse cate trei pe fiecare latura a patratului. Al doilea patrat contine urmatoarele 16 numere naturale distincte consecutive, dispuse cate cinci pe fiecare latura. Al treilea patrat contine urmatoarele 24 de numere naturale distincte consecutive, dispuse cate sapte pe fiecare latura. Al patrulea patrat contine urmatoarele 32 de numere naturale distincte consecutive, dispuse cate noua pe fiecare latura etc.

Cerinte:

Scrieti un program care rezolva urmatoarele doua cerinte:

  1. Citeste un numar natural M si determina numarul K de valori continute de patratul numerotat cu M;
  2. Citeste un numar natural N si determina numarul T al patratului care contine numarul N pe una dintre laturi.

Date de intrare:

Fisierul de intrare patrate.in contine pe prima linie un numar natural C reprezentand cerinta din problema care trebuie rezolvata (1 sau 2). Daca C = 1, atunci fisierul contine pe a doua linie numarul natural M. Daca C = 2, atunci fisierul contine pe a doua linie numarul natural N.

Date de iesire: 

Daca C = 1, atunci fisierul de iesire patrate.out contine pe prima linie numarul K, reprezentand raspunsul la cerinta 1 a problemei. Daca C = 2, atunci fisierul de iesire patrate.out contine pe prima linie numarul natural T, reprezentand raspunsul la cerinta 2.

Restrictii si precizari:

  1. 1 <= M <= 260000000.
  2. 7 <= N <= 2147302920.
  3. Numerele N, M, T si K sunt numere naturale.
  4. NU exista doua patrate cu acelasi numar de valori scrise pe laturi.
  5. Pentru rezolvarea corecta a cerintei 1 se acorda 10 puncte; pentru rezolvarea corecta a cerintei 2 se acorda 80 de puncte. Se acorda 10 puncte din oficiu.

Exemplul 1:

patrate.in:
1
3

patrate.out:
24

Explicatii:

Cerinta este 1. Patratul numerotat cu M =3 contine K = 24 de numere naturale (vezi figura din enunt).


Exemplul 2:

patrate.in:
2
73

patrate.out:
4

Explicatii:

Cerinta este 2. Numarul N = 73 este continut de patratul K = 24 numerotat cu T = 4 (vezi figura din enunt).


Mai jos veti gasi metoda mea de rezolvare a problemei:

#include <fstream>
using namespace std;

ifstream fin("patrate.in");
ofstream fout("patrate.out");
int task, cuben, number, i = 0;

int numberOfNumbersOnCube(int cuben) {
    return (2*cuben+1)*2+(2*cuben-1)*2;
}

int main() {
    fin >> task;
    if (task == 1) {
       fin >> cuben;
       fout << numberOfNumbersOnCube(cuben);
    } else if (task == 2) {
       fin >> number;
       for (int j = 0;; ::i++) {
          j += numberOfNumbersOnCube(i);
          if (j > number) break;
       }
       fout << i;
    }
    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 *