3438 - Triunghi 5
Se consideră A
un tablou bidimensional cu n
linii, n
coloane și elemente numere naturale. O zonă triunghiulară a tabloului, reprezentată de tripletul (lin, col, k)
, este o zonă de forma unui triunghi dreptunghic cu catetele de lungime egală cu |k|
, definită astfel:
- Pentru
k>0
, zona este compusă dink
linii:- pe prima linie a zonei se află elementele
A[lin][col]
,A[lin][col+1]
, …,A[lin][col+k-1]
; - pe a doua linie a zonei se află elementele
A[lin+1][col]
,A[lin+1][col+1]
, …,A[lin+1][col+k-2]
; - pe a treia linie a zonei se află elementele
A[lin+2][col]
,A[lin+2][col+1]
, …,A[lin+2][col+k-3]
; - …
- pe ultima linie a zonei se află elementul
A[lin+k-1][col]
.
- pe prima linie a zonei se află elementele
- Pentru
k<0
, zona este compusă din|k|=-k
linii:- pe prima linie a zonei se află elementul
A[lin-|k|+1][col]
; - pe a doua linie a zonei se află elementele
A[lin-|k|+2][col-1]
,A[lin-|k|+2][col]
; - …
- pe ultima linie a zonei se află elementele
A[lin][col-|k|+1]
,A[lin][col-|k|+2]
,…,A[lin][col]
.
- pe prima linie a zonei se află elementul
Suma elementelor ce compun o zonă triunghiulară se numește suma zonei.
Cerința[edit | edit source]
Scrieţi un program care, cunoscând tabloul A
şi Q
zone triunghiulare, determină cea mai mare dintre sumele zonelor.
Date de intrare[edit | edit source]
Fișierul de intrare triunghi.in
conține pe prima linie numărul natural n
, cu semnificaţia din enunţ. Pe următoarele n
linii se găsesc câte n valori naturale, reprezentând elementele tabloului A
. Pe linia n+2
se află numărul natural Q
, reprezentând numărul zonelor triunghiulare. Pe următoarele Q
linii se găsesc tripletele de valori lin col k
, care reprezintă cele Q
zone, în forma descrisă în enunţ. Valorile aflate pe aceeaşi linie a fişierului sunt separate prin câte un spațiu.
Date de ieșire[edit | edit source]
Fișierul de ieșire triunghi.out
va conține o singură linie pe care va fi scris un număr natural reprezentând suma maximă cerută.
Restricții și precizări[edit | edit source]
3 ≤ n ≤ 1000
;1 ≤ Q ≤ 100000
;2 ≤ |k| ≤ n
- Valorile din tablou sunt numere naturale din intervalul
[1,100]
. - Liniile şi coloanele tabloului
A
sunt numerotate de la1
lan
(liniile de sus în jos, iar coloanele de la stânga la dreapta). |k|
reprezintă modulul număruluik
(k
, pentruk≥0
, respectiv-k
, pentruk<0
).- Se garantează că orice zonă triunghiulară dintre cele
Q
este complet inclusă în tabloulA
.
Exemplu:[edit | edit source]
triunghi.in
6 5 8 10 4 9 4 2 10 10 2 4 8 8 10 3 4 6 6 4 6 9 7 1 9 6 7 2 2 10 6 10 4 6 1 10 4 3 4 1 3 4 4 -4 6 5 -2
triunghi.out
59
Explicație[edit | edit source]
Zona triunghiulară de sumă maximă (59
) este reprezentată de tripletul (4 4 -4)
și conține
valorile evienţiate: 59=4+(10+2)+(10+3+4)+(4+6+9+7)
.
<syntaxhighlight lang="python" line="1"> def suma_zona_triunghiulara(A, lin, col, k):
suma = 0 n = len(A) if k > 0: # Zona triunghiulară pentru k > 0 for i in range(k): for j in range(k - i): suma += A[lin + i][col + j] else: # Zona triunghiulară pentru k < 0 k = -k for i in range(k): for j in range(i + 1): suma += A[lin - i + (k - 1)][col - j + (k - 1)] return suma
def cea_mai_mare_suma(A, interogari):
max_suma = float('-inf') for (lin, col, k) in interogari: suma = suma_zona_triunghiulara(A, lin, col, k) if suma > max_suma: max_suma = suma return max_suma
- Citire date
n = int(input()) A = [list(map(int, input().split())) for _ in range(n)] Q = int(input()) interogari = [tuple(map(int, input().split())) for _ in range(Q)]
- Calculare cea mai mare sumă
result = cea_mai_mare_suma(A, interogari) print(result) </syntaxhighlight>