3024 - ou: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
 
(2 intermediate revisions by one other user not shown)
Line 10: Line 10:


== Date de ieșire ==  
== 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:  
Dacă datele sunt introduse corect, pe ecran se va afișa:  
'''"Datele sunt introduse corect."''', apoi pe un rând nou '''numărul c''', reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: '''"Datele nu corespund restricțiilor impuse."'''.
'''"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 ==
== Restricţii şi precizări ==
* 3 ≤ n ≤ 100.000
* 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  
* numerele de pe a doua linie a fișierului de intrare vor fi naturale nenule, mai mici decât 1.000.000.000  
== Exemplu ==
== Exemplu 1 ==
; Intrare
; Intrare
: ou.in
: 5
: 5
: 13 2 7 44 5
: 13 2 7 44 5
; Ieșire
; Ieșire
: Datele nu corespund restricțiilor impuse.
: Datele sunt introduse correct.
: Datele sunt introduse correct.
: ou.out
: 15 1 26 1 28
: 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 ==  
Line 31: Line 42:
# 3024 - ou
# 3024 - ou


def citire():
def calculate_eggs(n, eggs):
     with open("ou.in") as f:
      
         n = int(f.readline())
    if n < 3 or n > 100000:
        O = list(map(int, f.readline().split()))
        return None
     return O, n
 
    if any(egg <= 0 or egg >= 1000000000 for egg in eggs):
         return None
 
     result = [0] * n


def rezolvare(O, n):
    S = sum(O)
    S /= n
    stanga = [0] * n
    dreapta = [0] * n
     for i in range(1, n):
     for i in range(1, n):
         stanga[i] = stanga[i - 1] + O[i - 1]
         result[i] += min(eggs[i], eggs[i - 1])
 
     for i in range(n - 2, -1, -1):
     for i in range(n - 2, -1, -1):
         dreapta[i] = dreapta[i + 1] + O[i + 1]
         result[i] += min(eggs[i], eggs[i + 1])
     sol = []
 
    for i in range(n):
     return result
         oua = (stanga[i] + dreapta[i]) // (2 * S)
 
         sol.append(oua)
 
    return sol
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


def validare(sol):
    with open("ou.in") as f:
        n = int(f.readline())
        O = list(map(int, f.readline().split()))
    for i in range(n):
        S = sum(O)
        S //= len(sol)
        for j in range(i - oua, i + oua + 1):
            if j >= 0 and j < n:
                S -= sol[j]
        if S != 0:
            return False
     return True
     return True


if __name__ == "__main__":
if __name__ == "__main__":
    O, n = citire()
 
    sol = rezolvare(O, n)
     with open("ou.in", "r") as f:
     with open("ou.out", "w") as f:
         n = int(f.readline().strip())
         f.write(" ".join(str(x) for x in sol))
        eggs = list(map(int, f.readline().strip().split()))
     if validare(sol):
 
     if not validate_input(n, eggs):
        print("Datele nu corespund restricțiilor impuse.")
    else:
         print("Datele sunt introduse corect.")
         print("Datele sunt introduse corect.")
    else:
        result = calculate_eggs(n, eggs)
         print("Datele nu corespund restricțiilor impuse.")
 
    print("\n".join(str(x) for x in sol))
        # 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>
</syntaxhighlight>
Line 81: Line 93:
Pentru a rezolva această problemă, vom urma următorii pași:
Pentru a rezolva această problemă, vom urma următorii pași:


Vom scrie o funcție citire() pentru a citi datele din fișierul de intrare.
Funcția calculate_eggs(n, eggs):
Vom scrie o funcție rezolvare(O, n) care primește lista O cu numărul de ouă pentru fiecare casă și numărul de case n, și returnează lista cu numărul de ouă pe care îl va avea fiecare proprietar la sfârșitul zilei.
 
Vom scrie o funcție validare(sol) pentru a valida soluția noastră, verificând dacă numărul total de ouă împărțit de fiecare proprietar corespunde cu numărul de ouă pe care îl are inițial.
Această funcție primește numărul de case n și lista eggs cu numărul de ouă din fiecare casă.
În funcția citire() se deschide fișierul "ou.in" și se citesc cele două linii. Prima linie conține numărul de case n, iar a doua linie conține 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.
Funcția rezolvare(O, n) primește lista O și numărul de case n. Se calculează numărul total de ouă S, se calculează sumele pentru casele din stânga și din dreapta fie
Dacă valorile de intrare nu respectă restricțiile, funcția returnează None pentru a indica că datele sunt invalide.
În funcția main vom apela cele trei funcții și vom scrie rezultatul în fișierul de ieșire.
Î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.

Latest revision as of 22:35, 14 May 2023

Sursa: 3024 - ou


Cerinţa[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

  • 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[edit | edit source]

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

Exemplu 2[edit | edit source]

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


Rezolvare[edit | edit source]

Rezolvare ver. 1[edit | edit source]

<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[edit | edit source]

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.