0764 - Cirese: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerinţa == Gigel are o livadă împărțită în '''n*m''' sectoare, dispuse pe '''n''' linii, numeroate de la '''1''' la '''n''' și m coloane, numerotate de la '''1''' la '''m'''. În fiecare sector se află un cireș, care conține o cantitate de cireșe cunoscută. Gigel va culege toate cireșele din cireșii dispuși într-o zonă dreptunghiulară din livadă. El poate să aleagă între '''k''' zone și dorește să culeagă cât mai multe cireșe. Scrieți un prog...
 
 
(3 intermediate revisions by one other user not shown)
Line 12: Line 12:
* 1 ⩽ i1 ⩽ i2 ⩽ n
* 1 ⩽ i1 ⩽ i2 ⩽ n
* 1 ⩽ j1 ⩽ j2 ⩽ m
* 1 ⩽ j1 ⩽ j2 ⩽ m
== Exemplu ==
== Exemplul 1 ==
; Intrare
; Intrare
: 4 6 3
: 4 6 3
Line 23: Line 23:
: 2 1 4 3  
: 2 1 4 3  
; Ieșire
; Ieșire
: 102
: Datele de intrare corespund restrictiilor impuse
: Cantitatea maximă de cireșe pe care Gigel o poate culege este:  102
<br>
 
== Exemplul 2==
; Intrare
: 3 2 2
: 3 3 3
: 2 2
: 4 4 4
: 2 2
: 4 4 4
; Ieșire
: Datele de intrare nu corespund restrictiilor impuse
<br>
 
== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def validare(n, m, k, ciresi, zone):
    if not isinstance(n, int) or n < 1 or n > 100:
        raise ValueError("Datele de intrare nu corespund restrictiilor impuse")
    if not isinstance(m, int) or m < 1 or m > 100:
        raise ValueError("Datele de intrare nu corespund restrictiilor impuse")
    if not isinstance(k, int) or k < 1 or k > 100:
        raise ValueError("Datele de intrare nu corespund restrictiilor impuse")
    for linie in ciresi:
        for val in linie:
            if not isinstance(val, int) or val < 0 or val > 1000:
                raise ValueError("Datele de intrare nu corespund restrictiilor impuse")
    for z in zone:
        if len(z) != 4 or any(not isinstance(val, int) or val < 1
                              or (val > n and i % 2 == 0) or (val > m and i % 2 == 1) for i, val in enumerate(z)):
            raise ValueError("Datele de intrare nu corespund restrictiilor impuse")
    print("Datele de intrare corespund restrictiilor impuse")
    return True
def main():
def main():
     # Citim numerele n, m și k de la tastatură
     # Solicităm introducerea numerelor n, m și k
    print("Introduceți numerele n, m și k, separate printr-un spațiu: ")
     n, m, k = map(int, input().split())
     n, m, k = map(int, input().split())


     # Citim cantitatea de cireșe din fiecare sector
     # Citim cantitatea de cireșe din fiecare sector
    print("Introduceți cantitatea de cireșe din fiecare sector, linie cu linie: ")
     ciresi = [list(map(int, input().split())) for _ in range(n)]
     ciresi = [list(map(int, input().split())) for _ in range(n)]
    # Citim coordonatele zonelor
    print("Introduceți coordonatele zonelor: ")
    zone = [list(map(int, input().split())) for _ in range(k)]
    try:
        validare(n, m, k, ciresi, zone)  # apelul functiei de validare
    except ValueError as e:
        print(e)
        return


     # Inițializăm o matrice de sume parțiale
     # Inițializăm o matrice de sume parțiale
Line 43: Line 94:
     max_ciresi = 0
     max_ciresi = 0


     for _ in range(k):
     for z in zone:
        # Citim coordonatele zonei
        i1, j1, i2, j2 = map(int, input().split())
 
         # Actualizăm cantitatea maximă de cireșe dacă este cazul
         # Actualizăm cantitatea maximă de cireșe dacă este cazul
        i1, j1, i2, j2 = z
         max_ciresi = max(max_ciresi, suma[i2][j2] - suma[i2][j1 - 1] - suma[i1 - 1][j2] + suma[i1 - 1][j1 - 1])
         max_ciresi = max(max_ciresi, suma[i2][j2] - suma[i2][j1 - 1] - suma[i1 - 1][j2] + suma[i1 - 1][j1 - 1])


     # Afișăm cantitatea maximă de cireșe pe care Gigel o poate culege
     # Afișăm cantitatea maximă de cireșe pe care Gigel o poate culege
     print(max_ciresi)
     print("Cantitatea maximă de cireșe pe care Gigel o poate culege este: ", max_ciresi)




if __name__ == "__main__":
if __name__ == "__main__":
     main()
     main()


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 13:27, 1 December 2023

Cerinţa[edit | edit source]

Gigel are o livadă împărțită în n*m sectoare, dispuse pe n linii, numeroate de la 1 la n și m coloane, numerotate de la 1 la m. În fiecare sector se află un cireș, care conține o cantitate de cireșe cunoscută. Gigel va culege toate cireșele din cireșii dispuși într-o zonă dreptunghiulară din livadă. El poate să aleagă între k zone și dorește să culeagă cât mai multe cireșe.

Scrieți un program care determină cantitatea maximă de cireșe pe care o poate culege Gigel din una dintre cele k zone date.

Date de intrare[edit | edit source]

Programul citește de la tastatură numerele n m k, cu semnificația de mai sus. Apoi citește cantitatea de cireșe din fiecare sector, linie cu linie. Apoi citește k perechi de coordonate i1 j1 i2 j2, unde i1 j1 reprezintă coordonatele (linie coloana) ale colțului stânga-sus al zonei curente, iar i2 j2 reprezintă coordonatele (linie coloana) ale colțului dreapta-jos al zonei curente.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran numărul C, reprezentând cantitatea maximă de cireșe care poate fi culeasă din una dintre zonele date.

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

  • 1 ⩽ n , m , k ⩽ 100
  • cantitatea de cireșe din fiecare sector este un număr natural mai mic decât 1000
  • 1 ⩽ i1 ⩽ i2 ⩽ n
  • 1 ⩽ j1 ⩽ j2 ⩽ m

Exemplul 1[edit | edit source]

Intrare
4 6 3
3 1 10 7 5 2
1 5 3 8 6 3
10 1 3 8 10 8
6 1 8 3 9 1
2 2 3 5
1 2 4 6
2 1 4 3
Ieșire
Datele de intrare corespund restrictiilor impuse
Cantitatea maximă de cireșe pe care Gigel o poate culege este: 102


Exemplul 2[edit | edit source]

Intrare
3 2 2
3 3 3
2 2
4 4 4
2 2
4 4 4
Ieșire
Datele de intrare nu corespund restrictiilor impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def validare(n, m, k, ciresi, zone):

   if not isinstance(n, int) or n < 1 or n > 100:
       raise ValueError("Datele de intrare nu corespund restrictiilor impuse")
   if not isinstance(m, int) or m < 1 or m > 100:
       raise ValueError("Datele de intrare nu corespund restrictiilor impuse")
   if not isinstance(k, int) or k < 1 or k > 100:
       raise ValueError("Datele de intrare nu corespund restrictiilor impuse")
   for linie in ciresi:
       for val in linie:
           if not isinstance(val, int) or val < 0 or val > 1000:
               raise ValueError("Datele de intrare nu corespund restrictiilor impuse")
   for z in zone:
       if len(z) != 4 or any(not isinstance(val, int) or val < 1
                             or (val > n and i % 2 == 0) or (val > m and i % 2 == 1) for i, val in enumerate(z)):
           raise ValueError("Datele de intrare nu corespund restrictiilor impuse")
   print("Datele de intrare corespund restrictiilor impuse")
   return True


def main():

   # Solicităm introducerea numerelor n, m și k
   print("Introduceți numerele n, m și k, separate printr-un spațiu: ")
   n, m, k = map(int, input().split())
   # Citim cantitatea de cireșe din fiecare sector
   print("Introduceți cantitatea de cireșe din fiecare sector, linie cu linie: ")
   ciresi = [list(map(int, input().split())) for _ in range(n)]
   # Citim coordonatele zonelor
   print("Introduceți coordonatele zonelor: ")
   zone = [list(map(int, input().split())) for _ in range(k)]
   try:
       validare(n, m, k, ciresi, zone)  # apelul functiei de validare
   except ValueError as e:
       print(e)
       return
   # Inițializăm o matrice de sume parțiale
   suma = [[0] * (m + 1) for _ in range(n + 1)]
   # Calculăm suma parțială pentru fiecare sector
   for i in range(1, n + 1):
       for j in range(1, m + 1):
           suma[i][j] = suma[i - 1][j] + suma[i][j - 1] - suma[i - 1][j - 1] + ciresi[i - 1][j - 1]
   max_ciresi = 0
   for z in zone:
       # Actualizăm cantitatea maximă de cireșe dacă este cazul
       i1, j1, i2, j2 = z
       max_ciresi = max(max_ciresi, suma[i2][j2] - suma[i2][j1 - 1] - suma[i1 - 1][j2] + suma[i1 - 1][j1 - 1])
   # Afișăm cantitatea maximă de cireșe pe care Gigel o poate culege
   print("Cantitatea maximă de cireșe pe care Gigel o poate culege este: ", max_ciresi)


if __name__ == "__main__":

   main()


</syntaxhighlight>

Explicatie[edit | edit source]

Cantitatea de cireșe care pot fi culese din zona a doua este 102 și este mai mare decât cantitățile din celelalte două zone.