2839 - Par Impar 1

From Bitnami MediaWiki

Cerinţa

Se dă un număr natural, n (n∈[2,5000]), și un șir de 2·n numere naturale din intervalul [0,5]. Se cere să se determine valoarea obținută însumând toate produsele de forma x·y', und x și y sunt numere de paritate diferită, x fiind printre primii n termeni ai șirului dat, iar y printre ultimii n termeni ai acestui șir. Dacă nu există niciun astfel de produs, valoarea cerută este nulă.

Date de intrare

Fișierul de intrare parimpar1.in conține pe prima linie numărul n, iar pe a doua linie 2·n numere naturale separate prin spații.

Date de ieșire

Dacă datele sunt introduse corect, in fisier: "Datele sunt introduse corect.",fFișierul de ieșire parimpar1.out va conține pe a doua linie linie numărul S, reprezentând suma cerută. În cazul în care datele nu respectă restricțiile, se va afișa: "Datele nu corespund restricțiilor impuse.".

Restricţii şi precizări

  • Proiectați un algoritm eficient din punctul de vedere al spațiului de memorie utilizat şi al timpului de executare:
  • se recomandă o soluție care să nu memoreze elementele șirului într-un tablou sau altă structură de date similară.


Exemple

Exemplul 1

parimpar1.in
5
1 2 0 0 5 4 2 3 1 0
parimpar1.out
Datele sunt introduse corect.
44

Exemplul 2

parimpar1.in
2
3 1 4 1
parimpar1.out
Datele sunt introduse corect.
16

Exemplul 3

parimpar1.in
4
1 2 3 4 5 6 7 8
parimpar1.out
Datele nu corespund restricțiilor impuse.



Rezolvare

<syntaxhighlight lang="python" line="1">

  1. 2839 - Par Impar 1

def valideaza_input(n: int, lst: list[int]) -> bool:

   """
   Verifică dacă datele de intrare sunt valide conform cerințelor.
   """
   if not (2 <= n <= 5000) or len(lst) != 2 * n:
       return False
   for elem in lst:
       if not (0 <= elem <= 5):
           return False
   return True


def calculeaza_produse(n: int, lst: list[int]) -> int:

   """
   Calculează suma produselor x*y, unde x și y sunt numere de paritate diferită,
   x fiind unul dintre primii n termeni ai șirului dat, iar y fiind unul dintre ultimii n
   """
   suma = 0
   for i in range(n):
       for j in range(n):
           if lst[i] % 2 != lst[n + j] % 2:
               suma += lst[i] * lst[n + j]
   return suma


def afiseaza_rezultat(suma: int) -> None:

   """
   Afișează suma produselor în fișierul de ieșire.
   """
   with open("parimpar1.out", "w", encoding="utf-8") as f:
       if valideaza_input(n, lst):
           f.write("Datele sunt introduse corect.\n")
           f.write(str(suma))
       else:
           f.write("Datele nu corespund restricțiilor impuse.")


  1. Citirea datelor de intrare din fișier

with open("parimpar1.in", "r") as f:

   # Citim n din prima linie a fișierului și îl convertim la int
   n = int(f.readline().strip())
   # Citim lista de numere din a doua linie a fișierului și o convertim la listă de int
   lst = list(map(int, f.readline().split()))
  1. Calcularea și afișarea sumei produselor în fișierul de ieșire

suma = calculeaza_produse(n, lst) afiseaza_rezultat(suma)






</syntaxhighlight>