2554 - Or

From Bitnami MediaWiki
Revision as of 20:22, 29 December 2023 by Vasiliu Costel Andrei (talk | contribs) (Pagină nouă: == Enunț == Se consideră numerele naturale X, N și o matrice pătratică A cu N x N elemente numere naturale. == Cerința == 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 == 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 natura...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Enunț[edit]

Se consideră numerele naturale X, N și o matrice pătratică A cu N x N elemente numere naturale.

Cerința[edit]

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]

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]

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]

  • 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]

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]

Submatricea este formată din elementele 3 1 9 de pe linia a treia (3 | 1 | 9 = 11).

Exemplul 2[edit]

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]

<syntaxhighlight lang="python" line>

  1. 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>