0282 - Poz Max

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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