3024 - ou

De la Universitas MediaWiki

Sursa: 3024 - ou


Cerinţa

Pe strada lui Dorel casele sunt aşezate doar de o parte a străzii. Cu ocazia sărbătorilor de Paşti, fiecare proprietar împarte ouă roşii vecinilor cei mai apropiaţi de casa lui. Se ştie că pe strada lui Dorel sunt n case, fiecare proprietar i are O[i] ouă, fiecare proprietar împarte ouă la un număr egal de case situate în stânga şi în dreapta lui, de asemenea fiecare vrea să împartă ouă la un număr maxim de case, un număr egal de ouă, cât mai mare, la fiecare casă. Dacă obiceiul de împărţire a ouălor are loc simultan, aflaţi câte ouă va avea fiecare la sfârşitul zilei.


Date de intrare

Fișierul de intrare ou.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații, reprezentând numărul ouălor din fiecare casă.


Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect." ou.out pe prima linie n numere, reprezentând numărul ouălor avute de fiecare proprietar la sfârşitul zilei., reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".

Restricţii şi precizări

  • 3 ≤ n ≤ 100.000
  • numerele de pe a doua linie a fișierului de intrare vor fi naturale nenule, mai mici decât 1.000.000.000

Exemplu 1

Intrare
ou.in
5
13 2 7 44 5
Ieșire
Datele sunt introduse correct.
ou.out
15 1 26 1 28

Exemplu 2

Intrare
ou.in
5
-13 2 72 44 -5
Ieșire
Datele nu corespund restricțiilor impuse.


Rezolvare

Rezolvare ver. 1

# 3024 - ou

def calculate_eggs(n, eggs):
    
    if n < 3 or n > 100000:
        return None

    if any(egg <= 0 or egg >= 1000000000 for egg in eggs):
        return None

    result = [0] * n

    for i in range(1, n):
        result[i] += min(eggs[i], eggs[i - 1])

    for i in range(n - 2, -1, -1):
        result[i] += min(eggs[i], eggs[i + 1])

    return result


def validate_input(n, eggs):

    if n < 3 or n > 100000:
        return False

    if any(egg <= 0 or egg >= 1000000000 for egg in eggs):
        return False

    return True


if __name__ == "__main__":

    with open("ou.in", "r") as f:
        n = int(f.readline().strip())
        eggs = list(map(int, f.readline().strip().split()))

    if not validate_input(n, eggs):
        print("Datele nu corespund restricțiilor impuse.")
    else:
        print("Datele sunt introduse corect.")
        result = calculate_eggs(n, eggs)

        # Scrierea rezultatului în fișierul de ieșire
        with open("ou.out", "w") as f:
            f.write(" ".join(str(egg) for egg in result))

Explicatie Rezolvare

Pentru a rezolva această problemă, vom urma următorii pași:

Funcția calculate_eggs(n, eggs):

Această funcție primește numărul de case n și lista eggs cu numărul de ouă din fiecare casă. În primul rând, funcția verifică dacă valorile de intrare respectă restricțiile impuse: numărul de case trebuie să fie între 3 și 100.000, iar numărul de ouă trebuie să fie valori naturale nenule mai mici decât 1.000.000.000. Dacă valorile de intrare nu respectă restricțiile, funcția returnează None pentru a indica că datele sunt invalide. În caz contrar, funcția procedează la împărțirea ouălor între proprietarii de case. Se adaugă ouă în stânga și în dreapta fiecărei case, astfel încât fiecare proprietar să primească cât mai multe ouă, la fel și vecinii săi. Funcția returnează o listă cu numărul de ouă pe care îl va avea fiecare proprietar la sfârșitul zilei. Funcția validate_input(n, eggs):

Această funcție verifică dacă datele de intrare respectă restricțiile impuse pentru numărul de case și numărul de ouă. Mai întâi, funcția verifică restricțiile pentru numărul de case: trebuie să fie între 3 și 100.000. Apoi, se verifică restricțiile pentru numărul de ouă: fiecare valoare trebuie să fie o valoare naturală nenulă mai mică decât 1.000.000.000. Funcția returnează True dacă datele de intrare sunt valide și respectă restricțiile, sau False în caz contrar. În blocul if __name__ == "__main__"::

Citirea datelor de intrare se face din fișierul "ou.in" și se extrag valorile numărului de case și lista de ouă. Se verifică validitatea datelor de intrare folosind funcția validate_input. Dacă datele de intrare sunt invalide, se afișează un mesaj corespunzător. În caz contrar, se afișează un mesaj că datele sunt introduse corect. Se apelează funcția calculate_eggs pentru a calcula numărul de ouă pe care îl va avea fiecare proprietar la sfârșitul zilei. Rezultatul este scris în fișierul de ieșire "ou.out". Aceste funcții și blocul principal de cod asigură citirea corectă a datelor de intrare, validarea lor și rezolvarea problemei conform cerințelor, respectând și restricțiile impuse.