2084 - water trap: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerinţa == Determinați cantitatea maximă de apă reținută (exprimată în mililitri). == Date de intrare == Programul citește de la tastatură numărul '''n''', iar apoi '''n''' numere naturale, separate prin spații, ce reprezintă înălțimile barelor. == Date de ieșire == Programul va afișa pe ecran numărul '''W''', ce reprezintă cantitatea de apă ce poate fi reținută. == Restricţii şi precizări == * '''2''' ⩽ '''n''' ⩽ '''100.000''' * cele '''n...
 
No edit summary
Tag: Manual revert
 
(9 intermediate revisions by 2 users not shown)
Line 8: Line 8:
* '''2''' ⩽ '''n''' ⩽ '''100.000'''
* '''2''' ⩽ '''n''' ⩽ '''100.000'''
* cele '''n''' numere citite vor fi mai mici decât '''1.000'''
* cele '''n''' numere citite vor fi mai mici decât '''1.000'''
== Exemple ==
== Exemplu 1 ==
;Intrare
; Intrare
: 6
: 6
: 3 0 0 2 0 4
: 3 0 0 2 0 4
;Iesire
; Iesire
: 10
Datele de intrare corespund restrictiilor impuse
;Intrare
10
: 12
<br>
: 0 1 0 2 1 0 1 3 2 1 2 1
== Exemplu 2 ==
;Iesire
; Intrare
: 6
12
0 1 0 2 1 0 1 3 2 1 2 1
; Iesire
Datele de intrare corespund restrictiilor impuse
6
<br>
== Exemplu 3 ==
; Intrare
3
a 2 3
; Iesire
Datele de intrare nu corespund restrictiilor impuse
<br>
 
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def cantitate_maxima_apa(n, bare):
def validare(nr, bare1):  # functia de validare a datelor de intrare
 
    if len(bare1) != nr:
        raise ValueError
 
    if nr > 100000:
        raise ValueError
 
    for bara in bare:
        if not isinstance(bara, int) or bara < 0 or bara > 1000:
            raise ValueError
 
    print("Datele de intrare corespund restrictiilor impuse")
 
 
def cantitate_maxima_apa(nr, bare2):
     # Inițializăm cantitatea de apă și indicii pentru stânga și dreapta
     # Inițializăm cantitatea de apă și indicii pentru stânga și dreapta
     apa = 0
     apa = 0
     stanga = 0
     stanga = 0
     dreapta = n - 1
     dreapta = nr - 1


     max_stanga = max_dreapta = 0
     max_stanga = max_dreapta = 0
Line 31: Line 59:
     while stanga <= dreapta:
     while stanga <= dreapta:
         # Dacă bara din stânga este mai mică decât cea din dreapta
         # Dacă bara din stânga este mai mică decât cea din dreapta
         if bare[stanga] < bare[dreapta]:
         if bare2[stanga] < bare2[dreapta]:
             # Dacă bara curentă este mai mare decât maxima din stânga, o actualizăm
             # Dacă bara curentă este mai mare decât maxima din stânga, o actualizăm
             if bare[stanga] > max_stanga:
             if bare2[stanga] > max_stanga:
                 max_stanga = bare[stanga]
                 max_stanga = bare2[stanga]
             else:
             else:
                 # Altfel, adăugăm diferența dintre maxima din stânga și bara curentă la cantitatea de apă
                 # Altfel, adăugăm diferența dintre maxima din stânga și bara curentă la cantitatea de apă
                 apa += max_stanga - bare[stanga]
                 apa += max_stanga - bare2[stanga]
             # Mergem la următoarea bară din stânga
             # Mergem la următoarea bară din stânga
             stanga += 1
             stanga += 1
         else:
         else:
             # Procesăm similar barele din dreapta
             # Procesăm similar barele din dreapta
             if bare[dreapta] > max_dreapta:
             if bare2[dreapta] > max_dreapta:
                 max_dreapta = bare[dreapta]
                 max_dreapta = bare2[dreapta]
             else:
             else:
                 apa += max_dreapta - bare[dreapta]
                 apa += max_dreapta - bare2[dreapta]
             dreapta -= 1
             dreapta -= 1


     return apa
     return apa


# Punctul de intrare al programului
if __name__ == "__main__":
    n = int(input("Introduceți numărul de bare: "))
    bare = list(map(int, input("Introduceți înălțimile barelor, separate prin spații: ").split()))


     print("Cantitatea maximă de apă reținută este: ", cantitate_maxima_apa(n, bare))
if __name__ == '__main__':
 
    # din cauza datelor de intrare pot aparea 2 tipuri de erori, valueError sau IndexError pe care le tratam
     try:
        n = int(input("Introduceți numărul de bare (N): "))
        bare = list(map(int, input("Introduceți înălțimile barelor, separate prin spații: ").split()))
 
        validare(n, bare)  # apelul functiei de validare
        result = cantitate_maxima_apa(n, bare)  # apelul functiei de rezolvare
        print("Cantitatea maximă de apă reținută este: ", result)
 
    except ValueError:
        print("Datele de intrare nu corespund restrictiilor impuse")
    except IndexError:
        print("Datele de intrare nu corespund restrictiilor impuse")


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 13:58, 12 December 2023

Cerinţa[edit | edit source]

Determinați cantitatea maximă de apă reținută (exprimată în mililitri).

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spații, ce reprezintă înălțimile barelor.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran numărul W, ce reprezintă cantitatea de apă ce poate fi reținută.

Restricţii şi precizări[edit | edit source]

  • 2n100.000
  • cele n numere citite vor fi mai mici decât 1.000

Exemplu 1[edit | edit source]

Intrare
6
3 0 0 2 0 4
Iesire
Datele de intrare corespund restrictiilor impuse 
10


Exemplu 2[edit | edit source]

Intrare
12
0 1 0 2 1 0 1 3 2 1 2 1
Iesire
Datele de intrare corespund restrictiilor impuse
6


Exemplu 3[edit | edit source]

Intrare
3
a 2 3
Iesire
Datele de intrare nu corespund restrictiilor impuse 


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def validare(nr, bare1): # functia de validare a datelor de intrare

   if len(bare1) != nr:
       raise ValueError
   if nr > 100000:
       raise ValueError
   for bara in bare:
       if not isinstance(bara, int) or bara < 0 or bara > 1000:
           raise ValueError
   print("Datele de intrare corespund restrictiilor impuse")


def cantitate_maxima_apa(nr, bare2):

   # Inițializăm cantitatea de apă și indicii pentru stânga și dreapta
   apa = 0
   stanga = 0
   dreapta = nr - 1
   max_stanga = max_dreapta = 0
   while stanga <= dreapta:
       # Dacă bara din stânga este mai mică decât cea din dreapta
       if bare2[stanga] < bare2[dreapta]:
           # Dacă bara curentă este mai mare decât maxima din stânga, o actualizăm
           if bare2[stanga] > max_stanga:
               max_stanga = bare2[stanga]
           else:
               # Altfel, adăugăm diferența dintre maxima din stânga și bara curentă la cantitatea de apă
               apa += max_stanga - bare2[stanga]
           # Mergem la următoarea bară din stânga
           stanga += 1
       else:
           # Procesăm similar barele din dreapta
           if bare2[dreapta] > max_dreapta:
               max_dreapta = bare2[dreapta]
           else:
               apa += max_dreapta - bare2[dreapta]
           dreapta -= 1
   return apa


if __name__ == '__main__':

   # din cauza datelor de intrare pot aparea 2 tipuri de erori, valueError sau IndexError pe care le tratam
   try:
       n = int(input("Introduceți numărul de bare (N): "))
       bare = list(map(int, input("Introduceți înălțimile barelor, separate prin spații: ").split()))
       validare(n, bare)  # apelul functiei de validare
       result = cantitate_maxima_apa(n, bare)  # apelul functiei de rezolvare
       print("Cantitatea maximă de apă reținută este: ", result)
   except ValueError:
       print("Datele de intrare nu corespund restrictiilor impuse")
   except IndexError:
       print("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>