1421 - tabel
Enunț[edit | edit source]
După cum probabil ştiţi, contabilii îşi ţin datele sub formă de tabele şi calculează tot felul de sume pe linii şi pe coloane. Contabilul nostru Atnoc şi-a organizat valorile sub forma unui tabel cu n
linii (numerotate de la 1
la n
) şi m
coloane (numerotate de la 1
la m
). Elementele de pe ultima coloană sunt sumele elementelor de pe linii (mai exact, elementul de pe linia i
şi coloana m
este egal cu suma elementelor de pe linia i
aflate pe coloanele 1
, 2
, …, m-1
), iar elementele de pe ultima linie sunt sumele elementelor de pe coloane (mai exact, elementul de pe linia n
şi coloana i
este egal cu suma elementelor de pe coloana i
aflate pe liniile 1
, 2
, …, n-1
). Un exemplu de astfel de tabel este dat în figura următoare.
2
|
5
|
7
|
14
|
11
|
6
|
6
|
23
|
13
|
11
|
13
|
37
|
Din păcate, Atnoc a stropit cu apă minunatul său tabel şi astfel o parte dintre numerele din tabel au devenit ilizibile.
Cerința[edit | edit source]
Scrieţi un program care să reconstituie toate datele din tabel.
Date de intrare[edit | edit source]
Pe prima linie a fişierului text de intrare tabel.in
se află două numere naturale n
şi m
, separate printr-un spaţiu, ce reprezintă numărul de linii şi respectiv numărul de coloane ale tabelului. Pe cea de a doua linie a fişierului de intrare se află un număr natural p
care reprezintă numărul de valori nedeteriorate din tabel. Pe fiecare dintre următoarele p
linii se află câte trei numere naturale, separate prin câte un spaţiu l c v
, unde l
este numărul liniei, c
este numărul coloanei şi v
este valoarea elementului de pe linia l
şi coloana c
din tabel.
Date de ieșire[edit | edit source]
În fişierul text de ieşire tabel.out
se va scrie tabelul reconstituit, pe n
linii câte m
valori separate prin câte un spaţiu.
Restricții și precizări[edit | edit source]
1<n, m<51
- Valorile din tabel sunt numere naturale
< 32000
- În toate testele datele din tabel pot fi reconstituite.
Exemplu:[edit | edit source]
tabel.in
3 4 10 1 1 2 1 2 5 1 3 7 1 4 14 2 2 6 2 4 23 3 1 13 3 2 11 3 3 13 3 4 37
tabel.out
2 5 7 14 11 6 6 23 13 11 13 37
<syntaxhighlight lang="python" line="1"> def reconstruct_table(table):
n = len(table) # numărul de linii m = len(table[0]) # numărul de coloane # Functie pentru a calcula suma unei linii def calculate_row_sum(row): return sum(x for x in row if x is not None) # Functie pentru a calcula suma unei coloane def calculate_col_sum(table, col): return sum(table[i][col] for i in range(n-1) if table[i][col] is not None) # Pasul 1: Completarea liniilor folosind suma liniei for i in range(n-1): row_sum = table[i][m-1] current_sum = calculate_row_sum(table[i]) missing_count = table[i][:m-1].count(None) if missing_count == 1: for j in range(m-1): if table[i][j] is None: table[i][j] = row_sum - current_sum # Pasul 2: Completarea coloanelor folosind suma coloanei for j in range(m-1): col_sum = table[n-1][j] current_sum = calculate_col_sum(table, j) missing_count = sum(1 for i in range(n-1) if table[i][j] is None) if missing_count == 1: for i in range(n-1): if table[i][j] is None: table[i][j] = col_sum - current_sum # Pasul 3: Calcularea sumei pe ultima linie și ultima coloană for i in range(n-1): table[i][m-1] = calculate_row_sum(table[i]) for j in range(m-1): table[n-1][j] = calculate_col_sum(table, j) # Calcularea colțului de jos-dreapta table[n-1][m-1] = sum(table[n-1][j] for j in range(m-1)) return table
- Exemplu de utilizare:
table = [
[2, 5, 7, 14], [11, None, 6, 23], [None, 11, 13, 37]
]
reconstructed_table = reconstruct_table(table) for row in reconstructed_table:
print(row)
</syntaxhighlight>