3024 - ou
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
<syntaxhighlight lang="python" line>
- 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))
</syntaxhighlight>
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.