2412 - Sub Mat 1: Difference between revisions

From Bitnami MediaWiki
No edit summary
No edit summary
 
Line 1: Line 1:
Se consideră o matrice A cu următoarele proprietăţi:
Se consideră o matrice <code>A</code> cu următoarele proprietăţi:
*conţine n linii şi m coloane;
 
*conţine doar valorile 0 şi 1;
* conţine <code>n</code> linii şi <code>m</code> coloane;
*pe fiecare linie valorile sunt plasate în ordine crescătoare.
* conţine doar valorile <code>0</code> şi <code>1</code>;
Definim o submatrice determinată de perechea de linii L1 şi L2 (L1 ≤ L2) şi de perechea de coloane C1 şi C2 (C1 ≤ C2) ca fiind totalitatea elementelor matricei A[i,j] pentru care L1 ≤ i ≤ L2 şi C1 ≤ j ≤ C2.
* pe fiecare linie valorile sunt plasate în ordine crescătoare.
Dacă toate elementele unei submatrice sunt egale cu 0, atunci submatricea se numeşte nulă.
 
Asupra matricei A putem efectua una sau mai multe operaţii de interschimbări de linii. Prin astfel de interschimbări liniile matricei pot fi rearanjate astfel încât matricea A să conţină cel puţin o submatrice nulă cu număr maxim de elemente.
Definim o submatrice determinată de perechea de linii <code>L1</code> şi <code>L2</code> (<code>L1 ≤ L2</code>) şi de perechea de coloane <code>C1</code> şi <code>C2</code> (<code>C1 ≤ C2</code>) ca fiind totalitatea elementelor matricei <code>A[i,j]</code> pentru care <code>L1 ≤ i ≤ L2</code> şi <code>C1 ≤ j ≤ C2</code>.
== Cerința ==
 
Dacă toate elementele unei submatrice sunt egale cu <code>0</code>, atunci submatricea se numeşte nulă.
 
Asupra matricei <code>A</code> putem efectua una sau mai multe operaţii de interschimbări de linii. Prin astfel de interschimbări liniile matricei pot fi rearanjate astfel încât matricea <code>A</code> să conţină cel puţin o submatrice nulă cu număr maxim de elemente.
 
= Cerința =
Fiind dată o astfel de matrice se cere să se determine numărul maxim de zerouri dintr-o submatrice nulă ce se poate obţine printr-o rearanjare a liniilor matricei date.
Fiind dată o astfel de matrice se cere să se determine numărul maxim de zerouri dintr-o submatrice nulă ce se poate obţine printr-o rearanjare a liniilor matricei date.
== Date de intrare ==
Fișierul de intrare submat1.in conţine pe prima linie două numere naturale n m, separate printr-un spaţiu, reprezentând numărul de linii, respectiv numărul de coloane ale matricei A. Pe următoarele n linii ale fişierului sunt descrise cele n linii ale matricei A; pe fiecare linie din cele n vor fi scrise câte m valori din mulţimea {0, 1}, separate prin spaţii, reprezentând în ordine elementele liniei respective.
== Date de ieșire ==
Fișierul de ieșire submat1.out va conţine o singură linie pe care va fi scris un număr natural reprezentând numărul maxim de elemente pe care îl conţine o submatrice nulă rezultată în urma rearanjărilor liniilor matricei A.
== Restricții și precizări ==
*2 ≤ n, m ≤ 1000
<br>
*Pentru 60% din teste n, m ≤ 100.
== Exemplul 1 ==
; submat1in.txt
:3 5
:0 0 0 1 1
:0 1 1 1 1
:0 0 0 0 1
; submat1out.txt
:6
<br>
== Exemplul 2 ==
; submat1in.txt
:4 2
:0 0
:1 1
:0 1
:0 0
; submat1out.txt
:5
<br>
== Rezolvare ==
<syntaxhighlight lang="python" line>
#2412 - Sub Mat 1
def numar_maxim_zerouri(matrice):
    numar_linii = len(matrice)
    numar_coloane = len(matrice[0])


    matrice.sort(key=lambda linie: linie.count(0), reverse=True)
= Date de intrare =
Fișierul de intrare <code>submat1IN.txt</code> conţine pe prima linie două numere naturale <code>n m</code>, separate printr-un spaţiu, reprezentând numărul de linii, respectiv numărul de coloane ale matricei <code>A</code>. Pe următoarele <code>n</code> linii ale fişierului sunt descrise cele <code>n</code> linii ale matricei <code>A</code>; pe fiecare linie din cele <code>n</code> vor fi scrise câte <code>m</code> valori din mulţimea <code>{0, 1}</code>, separate prin spaţii, reprezentând în ordine elementele liniei respective.
 
= Date de ieșire =
Fișierul de ieșire <code>submat1OUT.txt</code> va conţine o singură linie pe care va fi scris un număr natural reprezentând numărul maxim de elemente pe care îl conţine o submatrice nulă rezultată în urma rearanjărilor liniilor matricei <code>A</code>. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".
 
= Restricții și precizări =
 
* <code>2 ≤ n, m ≤ 1000</code>
* Pentru <code>60%</code> din teste <code>n, m ≤ 100</code>.
 
= Exemplul 1: =
<code>submat1IN.txt</code>
3 5
0 0 0 1 1
0 1 1 1 1
0 0 0 0 1
<code>submat1OUT.txt</code>
6
 
=== Explicație ===
Dacă rearanjăm liniile astfel încât matricea rezultată să fie următoarea:
 
<code>0 0 0 1 1</code>
 
<code>0 0 0 0 1</code>


    prefixe = [linie.copy() for linie in matrice]
<code>0 1 1 1 1</code>
    for i in range(numar_linii):
        for j in range(1, numar_coloane):
            prefixe[i][j] += prefixe[i][j - 1]


    rezultat = 0
atunci se observă că submatricea determinată de prima şi a doua linie şi de prima şi a treia coloană conţine <code>6</code> valori de <code>0</code> (<code>6</code> fiind numărul maxim posibil).


    for i in range(numar_linii):
== Exemplul 2: ==
        for j in range(i, numar_linii):
<code>submat1IN.txt</code>
            numar_zerouri = prefixe[j][-1] if i == 0 else prefixe[j][-1] - prefixe[i - 1][-1]
1 5
            rezultat = max(rezultat, numar_zerouri * (j - i + 1))
0 0 0 1 1
0 1 1 1 1
0 0 0 0 1
<code>submat1OUT.txt</code>
Datele nu corespund restrictiilor impuse


    return rezultat
== Rezolvare ==
def verificare_restrictii(numar):   # funcția de verificare a datelor de intrare
<syntaxhighlight lang="python" line="1">
     if 2 <= n                   # adăugăm restricția pentru n
def verifica_restricii(n, m):
      m <= 1000
     return 2 <= n <= 1000 and 2 <= m <= 1000
        return True
    else:
        return False


def main():
def main():
     with open("submat1in.txt", "r") as file_in:
     with open('submat1IN.txt', 'r') as fin:
         n, m = map(int, file_in.readline().split())
         n, m = map(int, fin.readline().split())
         matrice = [list(map(int, file_in.readline().split())) for _ in range(n)]
 
    if not verifica_restricii(n, m):
         with open('submat1OUT.txt', 'w') as fout:
            fout.write("Datele nu corespund restrictiilor impuse\n")
        return 
    a = [0] * n
    with open('submat1IN.txt', 'r') as fin:
        next(fin) 
        for i in range(n):
            linie = list(map(int, fin.readline().split()))
            a[i] = linie.count(0)


     rezultat = numar_maxim_zerouri(matrice)
     a.sort(reverse=True)
    aria = 0
    for i in range(n):
        if aria < (i + 1) * a[i]:
            aria = (i + 1) * a[i]


     with open("submat1out.txt", "w") as file_out:
     with open('submat1OUT.txt', 'w') as fout:
         file_out.write(str(rezultat))
         fout.write(str(aria) + '\n')


if __name__ == "__main__":
if __name__ == '__main__':
     main()
     main()
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 15:05, 18 May 2024

Se consideră o matrice A cu următoarele proprietăţi:

  • conţine n linii şi m coloane;
  • conţine doar valorile 0 şi 1;
  • pe fiecare linie valorile sunt plasate în ordine crescătoare.

Definim o submatrice determinată de perechea de linii L1 şi L2 (L1 ≤ L2) şi de perechea de coloane C1 şi C2 (C1 ≤ C2) ca fiind totalitatea elementelor matricei A[i,j] pentru care L1 ≤ i ≤ L2 şi C1 ≤ j ≤ C2.

Dacă toate elementele unei submatrice sunt egale cu 0, atunci submatricea se numeşte nulă.

Asupra matricei A putem efectua una sau mai multe operaţii de interschimbări de linii. Prin astfel de interschimbări liniile matricei pot fi rearanjate astfel încât matricea A să conţină cel puţin o submatrice nulă cu număr maxim de elemente.

Cerința[edit | edit source]

Fiind dată o astfel de matrice se cere să se determine numărul maxim de zerouri dintr-o submatrice nulă ce se poate obţine printr-o rearanjare a liniilor matricei date.

Date de intrare[edit | edit source]

Fișierul de intrare submat1IN.txt conţine pe prima linie două numere naturale n m, separate printr-un spaţiu, reprezentând numărul de linii, respectiv numărul de coloane ale matricei A. Pe următoarele n linii ale fişierului sunt descrise cele n linii ale matricei A; pe fiecare linie din cele n vor fi scrise câte m valori din mulţimea {0, 1}, separate prin spaţii, reprezentând în ordine elementele liniei respective.

Date de ieșire[edit | edit source]

Fișierul de ieșire submat1OUT.txt va conţine o singură linie pe care va fi scris un număr natural reprezentând numărul maxim de elemente pe care îl conţine o submatrice nulă rezultată în urma rearanjărilor liniilor matricei A. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".

Restricții și precizări[edit | edit source]

  • 2 ≤ n, m ≤ 1000
  • Pentru 60% din teste n, m ≤ 100.

Exemplul 1:[edit | edit source]

submat1IN.txt

3 5
0 0 0 1 1
0 1 1 1 1
0 0 0 0 1

submat1OUT.txt

6

Explicație[edit | edit source]

Dacă rearanjăm liniile astfel încât matricea rezultată să fie următoarea:

0 0 0 1 1

0 0 0 0 1

0 1 1 1 1

atunci se observă că submatricea determinată de prima şi a doua linie şi de prima şi a treia coloană conţine 6 valori de 0 (6 fiind numărul maxim posibil).

Exemplul 2:[edit | edit source]

submat1IN.txt

1 5
0 0 0 1 1
0 1 1 1 1
0 0 0 0 1

submat1OUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1"> def verifica_restricii(n, m):

   return 2 <= n <= 1000 and 2 <= m <= 1000

def main():

   with open('submat1IN.txt', 'r') as fin:
       n, m = map(int, fin.readline().split())
   if not verifica_restricii(n, m):
       with open('submat1OUT.txt', 'w') as fout:
           fout.write("Datele nu corespund restrictiilor impuse\n")
       return  
   a = [0] * n
   with open('submat1IN.txt', 'r') as fin:
       next(fin)  
       for i in range(n):
           linie = list(map(int, fin.readline().split()))
           a[i] = linie.count(0)
   a.sort(reverse=True)
   aria = 0
   for i in range(n):
       if aria < (i + 1) * a[i]:
           aria = (i + 1) * a[i]
   with open('submat1OUT.txt', 'w') as fout:
       fout.write(str(aria) + '\n')

if __name__ == '__main__':

   main()

</syntaxhighlight>