2554 - Or
Enunț[edit | edit source]
Se consideră numerele naturale X, N și o matrice pătratică A cu N x N elemente numere naturale.
Cerința[edit | edit source]
Determinați aria minimă a unei submatrice cu proprietatea că efectuând operația or pe biți or între toate elementele submatricei se obține valoarea X.
Date de intrare[edit | edit source]
Fișierul de intrare orin.txt conține pe primul rând numerele naturale X și N, separate printr-un spațiu. Pe următoarele N linii sunt câte N elemente numere naturale separate printr-un spațiu, reprezentând elementele matricei.
Date de ieșire[edit | edit source]
Fișierul de ieșire orout.txt va conține un număr natural reprezentând aria minimă a unei submatrice.
Restricții și precizări[edit | edit source]
- 2 ⩽ N ⩽ 500
- 1 ⩽ A[i][j] ⩽ 2^31
- Operația pe biți or dintre două numere întregi este un întreg în care al i-lea bit este 0 dacă și numai dacă bitul i din ambele numere este 0.
- Se garantează că pentru toate datele de intrare există mereu o soluție și dimensiunea acesteia este cel puțin 2
Exemplul 1[edit | edit source]
- Intrare
- orin.txt
- 11 4
- 5 9 1 8
- 7 7 3 1
- 2 3 1 9
- 5 5 8 7
- Ieșire
- Datele de intrare corespund restricțiilor impuse
- orout.txt
- 3
Explicație[edit | edit source]
Submatricea este formată din elementele 3 1 9 de pe linia a treia (3 | 1 | 9 = 11).
Exemplul 2[edit | edit source]
- Intrare
- orin.txt
- 11 1
- 5 9 1 8
- 7 7 3 1
- 2 3 1 9
- 5 5 8 7
- Ieșire
- Datele de intrare NU corespund restricțiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 2554 - Or
import functools
def valideaza_input(n, matrice):
if not 2 <= n <= 500: return False
for rand in matrice: for element in rand: if not 1 <= element < 2 ** 31: return False
return True
def calculeaza_aria_minima(x, n, matrice):
aria_minima = float('inf')
for i in range(n): for j in range(n): for k in range(i, n): for l in range(j, n): submatrice = [rand[j:l + 1] for rand in matrice[i:k + 1]] rezultat_or_pe_biti = functools.reduce(lambda x, y: x | y, [element for rand in submatrice for element in rand])
if rezultat_or_pe_biti == x: aria_minima = min(aria_minima, (k - i + 1) * (l - j + 1))
return aria_minima
if __name__ == "__main__":
with open("orin.txt", "r") as f: x, n = map(int, f.readline().split()) matrice = [list(map(int, f.readline().split())) for _ in range(n)]
if valideaza_input(n, matrice): print("Datele de intrare corespund restricțiilor impuse")
rezultat = calculeaza_aria_minima(x, n, matrice)
with open("orout.txt", "w") as f: f.write(str(rezultat)) else: print("Datele de intrare NU corespund restricțiilor impuse") exit(0)
</syntaxhighlight>