2839 - Par Impar 1
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
# 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.")
# 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()))
# Calcularea și afișarea sumei produselor în fișierul de ieșire
suma = calculeaza_produse(n, lst)
afiseaza_rezultat(suma)