3024 - ou

From Bitnami MediaWiki
Revision as of 21:51, 14 May 2023 by Flaviu (talk | contribs)

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

Fișierul de ieșire ou.out va conține: Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou 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>

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


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