0765 - Cirese1: Difference between revisions

From Bitnami MediaWiki
No edit summary
Tag: Manual revert
 
(3 intermediate revisions by 2 users not shown)
Line 42: Line 42:
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def validare(n, m, k, ciresi, zone):
    if not n.isdigit() or int(n) < 1 or int(n) > 1000:
        print("Datele de intrare nu corespund restrictiilor impuse")
        return False
    if not m.isdigit() or int(m) < 1 or int(m) > 1000:
        print("Datele de intrare nu corespund restrictiilor impuse")
        return False
    if not k.isdigit() or int(k) < 1 or int(k) > 10000:
        print("Datele de intrare nu corespund restrictiilor impuse")
        return False
    for linie in ciresi:
        for val in linie:
            if not val.isdigit() or int(val) < 0 or int(val) > 10000:
                print("Datele de intrare nu corespund restrictiilor impuse")
                return False
    for z in zone:
        if len(z) != 4 or any(not val.isdigit() or int(val) < 1
                              or (int(val) > int(n) and i % 2 == 0)
                              or (int(val) > int(m) and i % 2 == 1) for i, val in enumerate(z)):
            print("Datele de intrare nu corespund restrictiilor impuse")
            return False
    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
     n, m, k = map(int, input().split())
    print("Introduceți numerele n, m și k, separate printr-un spațiu: ")
     n, m, k = input().split()


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


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


    # Pentru fiecare zonă dată
     for z in zone:
     for _ in range(k):
        # 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:53, 12 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 ⩽ 1000
  • 1 ⩽ k ⩽ 10000
  • cantitatea de cireșe din fiecare sector este un număr natural mai mic decât 10000
  • 1 ⩽ i1 ⩽ i2 ⩽ n
  • 1 ⩽ j1 ⩽ j2 ⩽ m
  • dacă ați rezolvat problema #Cirese ați observat deja că acum livada este mai mare, iar Gigel are mai multe variante de a alege zona din care să culeagă cireșele.

Exemplu[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


Exemplu 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 n.isdigit() or int(n) < 1 or int(n) > 1000:
       print("Datele de intrare nu corespund restrictiilor impuse")
       return False
   if not m.isdigit() or int(m) < 1 or int(m) > 1000:
       print("Datele de intrare nu corespund restrictiilor impuse")
       return False
   if not k.isdigit() or int(k) < 1 or int(k) > 10000:
       print("Datele de intrare nu corespund restrictiilor impuse")
       return False
   for linie in ciresi:
       for val in linie:
           if not val.isdigit() or int(val) < 0 or int(val) > 10000:
               print("Datele de intrare nu corespund restrictiilor impuse")
               return False
   for z in zone:
       if len(z) != 4 or any(not val.isdigit() or int(val) < 1
                             or (int(val) > int(n) and i % 2 == 0)
                             or (int(val) > int(m) and i % 2 == 1) for i, val in enumerate(z)):
           print("Datele de intrare nu corespund restrictiilor impuse")
           return False
   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 = input().split()
   # Citim cantitatea de cireșe din fiecare sector
   print("Introduceți cantitatea de cireșe din fiecare sector, linie cu linie: ")
   ciresi = [input().split() for _ in range(int(n))]
   # Citim coordonatele zonelor
   print("Introduceți coordonatele zonelor: ")
   zone = [input().split() for _ in range(int(k))]
   if not validare(n, m, k, ciresi, zone):  # apelul functiei de validare
       return
   n, m, k = int(n), int(m), int(k)
   ciresi = [[int(val) for val in linie] for linie in ciresi]
   zone = [[int(val) for val in z] for z in zone]
   # 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.