2827 - Sir 12
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ș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
- 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
Exemplul 1
- 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
- sir12.in
- 1 3 5 7 9 11
- ecran
- Datele sunt introduse corect.
- sir12.out
- Nu exista
Exemplul 3
- 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
<syntaxhighlight lang="python" line="1">
- 2827 - Sir 12
def valideaza_datele_intrare(sequenta):
if len(sequenta) > 1000000 or any(n < 1 or n > 1000000000 for n in sequenta): return False, "Datele nu corespund restricțiilor impuse." return True, ""
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
def 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 is_valid, mesaj_eroare = valideaza_datele_intrare(sequenta) if not is_valid: print(mesaj_eroare) return
print("Datele sunt introduse corect.")
# 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")
main()
</syntaxhighlight>