2637 - ZOO: Difference between revisions

From Bitnami MediaWiki
Line 47: Line 47:
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">
# Funcție pentru citirea matricei
def precalculeaza_sume(matrice, n, m):
def citeste_matrice():
     sume = [[0] * (m + 1) for _ in range(n + 1)]
    n, m = map(int, input().split())
     matrice = []
    for _ in range(n):
        linie = list(map(int, input().split()))
        matrice.append(linie)
    return matrice


# Funcție pentru calculul sumei într-un dreptunghi
     for i in range(1, n + 1):
def suma_dreptunghi(matrice, i1, j1, i2, j2):
         for j in range(1, m + 1):
    suma = 0
             sume[i][j] = matrice[i - 1][j - 1] + sume[i - 1][j] + sume[i][j - 1] - sume[i - 1][j - 1]
     for i in range(i1, i2 + 1):
         for j in range(j1, j2 + 1):
             suma += matrice[i][j]
    return suma


# Citirea matricei
    return sume
matrice = citeste_matrice()


# Citirea numărului de întrebări
def calculeaza_numar_animale(sume, i1, j1, i2, j2):
Q = int(input())
    return sume[i2][j2] - sume[i1 - 1][j2] - sume[i2][j1 - 1] + sume[i1 - 1][j1 - 1]


# Răspunsurile la întrebări
# Citire date de intrare
raspunsuri = []
with open("zooin.txt", "r") as file:
for _ in range(Q):
    n, m = map(int, file.readline().split())
     i1, j1, i2, j2 = map(int, input().split())
    matrice = [list(map(int, file.readline().split())) for _ in range(n)]
     rezultat = suma_dreptunghi(matrice, i1, j1, i2, j2)
    Q = int(file.readline())
     raspunsuri.append(rezultat)
     intrebari = [list(map(int, file.readline().split())) for _ in range(Q)]
 
# Precalculează sumele parțiale
sume = precalculeaza_sume(matrice, n, m)
 
# Calcul și afișare rezultate
rezultate = []
for intrebare in intrebari:
     i1, j1, i2, j2 = intrebare
    rezultate.append(calculeaza_numar_animale(sume, i1, j1, i2, j2))
 
# Scrie rezultatele în fișierul de ieșire
with open("zooout.txt", "w") as file:
     for rezultat in rezultate:
        file.write(str(rezultat) + "\n")


# Scrierea rezultatelor în fișier
with open("zoo.txt", "w") as fout:
    for raspuns in raspunsuri:
        fout.write(str(raspuns) + "\n")


</syntaxhighlight>
</syntaxhighlight>

Revision as of 09:57, 27 December 2023

Cerinta

Într-o grădină zoologică reprezentată printr-o matrice A cu n linii și m coloane, fiecare cușcă se află într-o poziție din matrice și conține x animale. De exemplu, dacă A[2][6] = 5 înseamnă că în cușcă de pe linia 2 și coloana 6 se află 5 animale. Să se răspundă la Q întrebări de forma i1, j1, i2, j2 unde răspunsul va fi numărul de animale din dreptunghiul din matrice cu cordonatele colțului din stânga sus i1 și j1 și cordonatele colțului din dreapta jos i2 și j2, unde i reprezintă linia și j coloana.

Date de intrare

Fișierul de intrare zooin.txt conține pe prima linie numerele n si m, separate printr-un spațiu, iar pe urmatoarele n linii, câte m numere, reprezentând matricea. Pe linia n + 2 se află numărul Q, iar pe următoarele Q linii, câte 4 numere (i1 j1 i2 j2) cu semnificația din enunț.

Date de iesire

Fișierul de ieșire zooout.txt pe fiecare linie i răspunsul la întrebarea i.

Restrictii si precizari

  • 1 ⩽ n, m ⩽ 100
  • 1 ⩽ Q ⩽ 100.000
  • numărul maxim de animale dintr-o cușcă este de 1.000.000.000
  • numerotarea liniilor și a coloanelor din matrice începe de la 1

Exemplul 1

zooin.txt
4 4
1 2 4 1
8 1 3 2
3 1 2 2
8 1 3 1
2
2 2 4 4
3 1 4 3
zooout.txt
Datele introduse corespund restrictiilor impuse
16
18

Exemplul 2

zooin.txt
4 3
-2 5 6
0 -1 7
0 0 1
-8 2 10
1
1 1 0 0
Datele introduse nu corespund restrictiilor impuse

Rezolvare

<syntaxhighlight lang="python3" line="1"> def precalculeaza_sume(matrice, n, m):

   sume = [[0] * (m + 1) for _ in range(n + 1)]
   for i in range(1, n + 1):
       for j in range(1, m + 1):
           sume[i][j] = matrice[i - 1][j - 1] + sume[i - 1][j] + sume[i][j - 1] - sume[i - 1][j - 1]
   return sume

def calculeaza_numar_animale(sume, i1, j1, i2, j2):

   return sume[i2][j2] - sume[i1 - 1][j2] - sume[i2][j1 - 1] + sume[i1 - 1][j1 - 1]
  1. Citire date de intrare

with open("zooin.txt", "r") as file:

   n, m = map(int, file.readline().split())
   matrice = [list(map(int, file.readline().split())) for _ in range(n)]
   Q = int(file.readline())
   intrebari = [list(map(int, file.readline().split())) for _ in range(Q)]
  1. Precalculează sumele parțiale

sume = precalculeaza_sume(matrice, n, m)

  1. Calcul și afișare rezultate

rezultate = [] for intrebare in intrebari:

   i1, j1, i2, j2 = intrebare
   rezultate.append(calculeaza_numar_animale(sume, i1, j1, i2, j2))
  1. Scrie rezultatele în fișierul de ieșire

with open("zooout.txt", "w") as file:

   for rezultat in rezultate:
       file.write(str(rezultat) + "\n")


</syntaxhighlight>

Explicatie

16=1+3+2+1+2+2+1+3+1 si 18=3+1+2+8+1+3