3001 - PSR

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Maricica este elevă în clasa a VIII-a și se pregătește pentru Examenul de Evaluare Națională. Profesorul de matematică a observat că Maricica nu stăpânește operațiile matematice elementare așa că, i-a oferit softul educațional PSR (produs – suma – radical) care funcționează astfel:

În fiecare rundă, calculatorul generează un număr natural A. Maricica trebuie să calculeze un număr R = partea întreagă a numărului √A∗(A+1)∗(A+2)∗(A+3)+1. Dacă răspunde corect, Maricica primește un punct altfel primește zero puncte pentru runda curentă. Jocul se desfășoară pe parcursul a N runde. Punctajul S obținut de Maricica se va calcula ca fiind suma punctajelor obținute în fiecare rundă. Câte puncte a acumulat Maricica?

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul natural N, reprezentând numărul de runde și apoi N perechi de numere naturale A și R, separate prin spații, reprezentând numărul generat de calculator și răspunsul dat de Maricica în runda curentă.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran, pe prima linie numărul S, reprezentând punctajul obținut de Maricica la sfârșitul celor N runde.

Restricţii şi precizări[edit | edit source]

  • 1 ⩽ N ⩽ 10000
  • 1 ⩽ A ⩽ 100000
  • 1 ⩽ R ⩽ 10000300001

Exemplu[edit | edit source]

Intrare
2
1 5
2 15
Iesire
Datele de intrare corespund restrictiilor impuse
Punctajul obținut de Maricica la sfârșitul celor 2 runde: 1

Exemplu 2[edit | edit source]

Intrare
1
35
Iesire
Datele de intrare nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def validare(nr, runda): # functia de validare a datelor de intrare

   if len(runda) != nr:
       raise ValueError
   if nr > 10000:
       raise ValueError
   for numar1, numar2 in runda:
       if (not isinstance(numar1, int) or numar1 < 1 or numar1 > 100000
               or not isinstance(numar2, int) or numar2 < 1 or numar2 > 10000300001):
           raise ValueError
   print("Datele de intrare corespund restrictiilor impuse")


def calculeaza_numar2(numar1):

   return int((numar1 * (numar1 + 1) * (numar1 + 2) * (numar1 + 3) + 1)**0.5)


def punctaj(runde1):

   puncte = 0
   for numar1, numar2 in runde1:
       valoare_asteptata_numar2 = calculeaza_numar2(numar1)
       if valoare_asteptata_numar2 == numar2:
           puncte += 1
   return puncte


if __name__ == '__main__':

   # din cauza datelor de intrare pot aparea 2 tipuri de erori, valueError sau IndexError pe care le tratam
   try:
       n = int(input("Introduceți numărul de runde (N): "))
       runde = []
       for i in range(n):
           A, R = map(int,
                      input("Introduceți numărul generat de calculator și răspunsul dat de Maricica (A R): ").split())
           runde.append((A, R))
       validare(n, runde)  # apelul functiei de validare
       result = punctaj(runde)  # apelul functiei de rezolvare
       print("Punctajul obținut de Maricica la sfârșitul celor", n, "runde:", result)
   except ValueError:
       print("Datele de intrare nu corespund restrictiilor impuse")
   except IndexError:
       print("Datele de intrare nu corespund restrictiilor impuse")


</syntaxhighlight>