0282 - Poz Max

De la Universitas MediaWiki

Sursă: [1]

Cerinţa

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

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

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

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

Exemple

Exemplu 1

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

Rezolvare

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

Explicații

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