2827 - Sir 12: Difference between revisions

From Bitnami MediaWiki
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):
         return False, "Datele nu corespund restricțiilor impuse."
         print("Datele nu corespund restricțiilor impuse.")
     return True, ""
        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


def main():
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
         is_valid, mesaj_eroare = valideaza_datele_intrare(sequenta)
         valideaza_datele_intrare(sequenta)
        if not is_valid:
            print(mesaj_eroare)
            return
 
        print("Datele sunt introduse corect.")


         # 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")


main()




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">

  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.