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
<syntaxhighlight lang="python" line="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.")
- 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)
</syntaxhighlight>