0282 - Poz Max

From Bitnami MediaWiki

Sursă: [1]

Cerinţa[edit | edit source]

Se dă un şir cu n elemente, numere reale, numerotate de la 1 la n. Determinaţi numărul de ordine al primei şi al ultimei apariţii a valorii maxime din şir.

Date de intrare[edit | edit source]

Fişierul de intrare pozmax.in conţine pe prima linie numărul n; urmează n numere reale, dispuse pe mai multe linii şi separate prin spaţii.

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.". Fişierul de ieşire pozmax.out va conţine pe prima linie două numere p şi u, reprezentând valorile cerute. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricții și precizări[edit | edit source]

  • n este un număr natural cu cel mult 9 cifre;

Exemple[edit | edit source]

Exemplu 1[edit | edit source]

pozmax.in
8
3.5 7 -4 7 2 7 6.3 5
pozmax.out
2 6

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1"> def citeste_n():

   while True:
       try:
           with open("pozmax.in", "r") as fin:
               n = int(fin.readline())
               if n >= 1 and n <= 1000000000:
                   print("Datele sunt corecte.")
                   return n
               else:
                   print("Datele nu sunt conform restricțiilor impuse.")
                   exit()
       except ValueError:
           print("Trebuie introduse doar numere intregi.")
           exit()

def citeste_valori(n):

   valori = []
   with open("pozmax.in", "r") as fin:
       fin.readline()
       for i in range(n):
           linie = fin.readline().strip().split()
           while len(linie) != n:
               linie += fin.readline().strip().split()
           try:
               for j in range(n):
                   if float(linie[j]) <= 10**9:
                       valori.append(float(linie[j]))
                   else:
                       print("Datele nu sunt conform restricțiilor impuse.")
                       exit()
           except ValueError:
               print("Trebuie introduse doar numere reale.")
               exit()
   return valori

def pozitii_max(valori):

   max_val = max(valori)
   p = valori.index(max_val) + 1
   u = len(valori) - valori[::-1].index(max_val)
   return p, u

if _name_ == '_main_':

   n = citeste_n()
   valori = citeste_valori(n)
   p, u = pozitii_max(valori)
   with open("pozmax.out", 'w') as f:
       f.write(str(p) + " " + str(u))

</syntaxhighlight>

Explicații[edit | edit source]

Acest cod implementează o soluție pentru problema de găsire a pozițiilor primei și ultimei apariții a valorii maxime dintr-un șir de numere reale.
Funcția citeste_n() este folosită pentru a citi valoarea n din fișierul de intrare "pozmax.in" și verifică dacă se încadrează în restricțiile impuse (între 1 și 1 miliard).
Funcția citeste_valori(n) este utilizată pentru a citi șirul de n numere reale din fișierul de intrare "pozmax.in". Aceasta verifică dacă numerele sunt conforme cu restricțiile impuse (valori între -1 miliard și 1 miliard) și, în caz contrar, iese din program cu un mesaj de eroare.
Funcția pozitii_max(valori) primește șirul de numere reale și găsește valoarea maximă din șir folosind funcția max(). Folosind metoda index(), aceasta determină poziția primei apariții a valorii maxime și adaugă 1 pentru a obține poziția în numerotare de la 1. De asemenea, calculează poziția ultimei apariții a valorii maxime folosind metoda index() combinată cu o inversare a șirului și adaugă lungimea șirului pentru a obține poziția în numerotare de la 1.
În funcția main(), se apelează cele trei funcții pentru a citi datele de intrare, a determina pozițiile valorii maxime și a scrie rezultatul în fișierul de ieșire "pozmax.out".