2827 - Sir 12: Difference between revisions
Pagină nouă: == Cerinţa == Se consideră un șir de cel mult '''10^6''' numere naturale distincte din intervalul '''[1,10^9]'''. Se cere să se determine cei mai mari doi termeni pari din șir care sunt precedați de doar trei termeni impari. == Date de intrare == Fișierul de intrare '''sir12.in''' conține pe prima termenii șirului, separați prin câte un spațiu. == Date de ieșire == Dacă datele sunt introduse corect, pe ecran: "Datele sunt introduse corect.",Fișierul de ieșir... |
No edit summary |
||
Line 38: | Line 38: | ||
<syntaxhighlight lang="python" line="1"> | <syntaxhighlight lang="python" line="1"> | ||
# 2827 - Sir 12 | # 2827 - Sir 12 | ||
import sys | |||
def valideaza_datele_intrare(sequenta): | def valideaza_datele_intrare(sequenta): | ||
if len(sequenta) > 1000000 or any(n < 1 or n > 1000000000 for n in sequenta): | if len(sequenta) > 1000000 or any(n < 1 or n > 1000000000 for n in sequenta): | ||
print("Datele nu corespund restricțiilor impuse.") | |||
sys.exit(0) | |||
print("Datele sunt introduse corect.") | |||
def gaseste_maxime_pare_precedati_de_3_impare(sequenta): | def gaseste_maxime_pare_precedati_de_3_impare(sequenta): | ||
Line 60: | Line 63: | ||
return None | return None | ||
if __name__ == "__main__": | |||
with open("sir12.in") as fin, open("sir12.out", "w") as fout: | with open("sir12.in") as fin, open("sir12.out", "w") as fout: | ||
# citeste datele de intrare | # citeste datele de intrare | ||
Line 66: | Line 69: | ||
# valideaza datele de intrare | # valideaza datele de intrare | ||
valideaza_datele_intrare(sequenta) | |||
# gaseste cei mai mari doi termeni pari | # gaseste cei mai mari doi termeni pari | ||
Line 80: | Line 78: | ||
fout.write("Nu exista") | fout.write("Nu exista") | ||
Line 92: | Line 89: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==Explicatie== | |||
Valideaza_datele_intrare(sequenta): această funcție primește ca argument o secvență de numere întregi și verifică dacă aceasta corespunde restricțiilor impuse. În caz contrar, afișează un mesaj de eroare și oprește execuția programului prin apelarea funcției sys.exit(0). În cazul în care secvența de numere respectă restricțiile, afișează un mesaj de confirmare. | |||
Gaseste_maxime_pare_precedati_de_3_impare(sequenta): această funcție primește ca argument o secvență de numere întregi și caută cei mai mari doi termeni pari care sunt precedați de cel puțin 3 termeni impari în secvență. Dacă astfel de termeni există, funcția returnează cei doi termeni maxim pari găsiți în ordine descrescătoare. În caz contrar, funcția returnează valoarea None. | |||
Funcțiile sunt apoi utilizate în funcția principală main(), care citeste datele de intrare dintr-un fișier și scrie rezultatele într-un alt fișier. În cazul în care datele de intrare nu respectă restricțiile impuse, programul se va opri înainte de a apela funcția gaseste_maxime_pare_precedati_de_3_impare(sequenta). Dacă datele sunt corecte, programul va apela funcția gaseste_maxime_pare_precedati_de_3_impare(sequenta) și va scrie rezultatul în fișierul de ieșire. |
Latest revision as of 05:17, 2 April 2023
Cerinţa[edit | edit source]
Se consideră un șir de cel mult 10^6 numere naturale distincte din intervalul [1,10^9]. Se cere să se determine cei mai mari doi termeni pari din șir care sunt precedați de doar trei termeni impari.
Date de intrare[edit | edit source]
Fișierul de intrare sir12.in conține pe prima termenii șirului, separați prin câte un spațiu.
Date de ieșire[edit | edit source]
Dacă datele sunt introduse corect, pe ecran: "Datele sunt introduse corect.",Fișierul de ieșire sir12.out va conține pe prima linie termenii determinați, în ordine strict crescătoare, separați printr-un spațiu, iar dacă în șir nu există doi astfel de termeni, se afișează mesajul Nu exista. În cazul în care datele nu respectă restricțiile, se va afișa: "Datele nu corespund restricțiilor impuse.".
Restricţii şi precizări[edit | edit source]
- Pentru determinarea și afișarea numerelor cerute se utilizează un algoritm eficient din punctul de vedere al spațiului de memorie și al timpului de executare;
- Se recomandă evitarea memorării numerelor într-un tablou sau în altă structură de date similară
Exemple[edit | edit source]
Exemplul 1[edit | edit source]
- sir12.in
- 4 3 5 312 27 30 14 212 11 15 17 400
- ecran
- Datele sunt introduse corect.
- sir12.out
- 30 212
Exemplul 2[edit | edit source]
- sir12.in
- 1 3 5 7 9 11
- ecran
- Datele sunt introduse corect.
- sir12.out
- Nu exista
Exemplul 3[edit | edit source]
- sir12.in
- 1 2 3 4 5 6 -1
- ecran
- Datele nu corespund restricțiilor impuse.
- sir12.out
(Nu se scrie niciun rezultat în fișierul de ieșire pentru acest exemplu, deoarece datele de intrare nu sunt valide.)
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line="1">
- 2827 - Sir 12
import sys
def valideaza_datele_intrare(sequenta):
if len(sequenta) > 1000000 or any(n < 1 or n > 1000000000 for n in sequenta): print("Datele nu corespund restricțiilor impuse.") sys.exit(0) print("Datele sunt introduse corect.")
def gaseste_maxime_pare_precedati_de_3_impare(sequenta):
cnt = 0 max1, max2 = -1, -1 for n in sequenta: if n % 2 == 1: cnt += 1 elif cnt == 3: if n > max1: max2 = max1 max1 = n elif n > max2: max2 = n if max1 != -1 and max2 != -1: return max2, max1 else: return None
if __name__ == "__main__":
with open("sir12.in") as fin, open("sir12.out", "w") as fout: # citeste datele de intrare sequenta = list(map(int, fin.readline().split()))
# valideaza datele de intrare valideaza_datele_intrare(sequenta)
# gaseste cei mai mari doi termeni pari maxime_pare = gaseste_maxime_pare_precedati_de_3_impare(sequenta) if maxime_pare is not None: fout.write(f"{maxime_pare[0]} {maxime_pare[1]}") else: fout.write("Nu exista")
</syntaxhighlight>
Explicatie[edit | edit source]
Valideaza_datele_intrare(sequenta): această funcție primește ca argument o secvență de numere întregi și verifică dacă aceasta corespunde restricțiilor impuse. În caz contrar, afișează un mesaj de eroare și oprește execuția programului prin apelarea funcției sys.exit(0). În cazul în care secvența de numere respectă restricțiile, afișează un mesaj de confirmare.
Gaseste_maxime_pare_precedati_de_3_impare(sequenta): această funcție primește ca argument o secvență de numere întregi și caută cei mai mari doi termeni pari care sunt precedați de cel puțin 3 termeni impari în secvență. Dacă astfel de termeni există, funcția returnează cei doi termeni maxim pari găsiți în ordine descrescătoare. În caz contrar, funcția returnează valoarea None.
Funcțiile sunt apoi utilizate în funcția principală main(), care citeste datele de intrare dintr-un fișier și scrie rezultatele într-un alt fișier. În cazul în care datele de intrare nu respectă restricțiile impuse, programul se va opri înainte de a apela funcția gaseste_maxime_pare_precedati_de_3_impare(sequenta). Dacă datele sunt corecte, programul va apela funcția gaseste_maxime_pare_precedati_de_3_impare(sequenta) și va scrie rezultatul în fișierul de ieșire.