3793 - Cort

De la Universitas MediaWiki

O curte dreptunghiulară de lungime N și lățime M (vom numi N linii și M coloane) este pavată cu dale

pătrate de dimensiune 1. Dalele au două culori, sunt albe sau negre (vom codifica dalele albe cu 0 și dalele negre cu 1). Dalele negre sunt fabricate dintr-un material mult mai rezistent decât dalele albe, iar Ionel ar vrea sa monteze un cort de suprafață maximă sub care să fie doar dale negre. El știe de asemenea că există doar corturi dreptunghiulare și pătrate, de orice dimensiune. Din motive tehnice, Ionel poate să facă doar următoarele operații cu dalele din curte:

  • să schimbe între ele oricâte dale de pe aceeși linie;
  • să schimbe de oricâte ori dorește o linie întreagă cu altă linie tot întreagă;

Cerința

Scrieți un program care rezolvă următoarele două cerințe:

1. Afișează numărul maxim de dale negre care s-ar putea obține pe o coloană după rearanjare;

2. Afișează aria maximă a cortului ce poate fi amplasat doar pe dale negre.

Date de intrare

Fișierul de intrare cort.in conține pe prima linie un număr natural C reprezentând cerința din problemă

care trebuie rezolvată (1 sau 2). A doua linie din fișier conține două numere naturale N și M, reprezentând

lungimea, respectiv lățimea curții. Pe fiecare dintre următoarele N linii se găsesc câte M valori de 0 sau 1, acestea indicând culoarea dalei de pe acea poziție.

Date de ieșire

Dacă C = 1, fișierul de ieșire cort.out va conține un număr reprezentând răspunsul la cerința 1.

Dacă C = 2, fișierul de ieșire cort.out va conține un număr reprezentând răspunsul la cerința 2.

Restricții și precizări

  • 1 ≤ N ≤ M ≤ 1000
  • Există cel puțin o dală neagra

Exemplul 1:

cort.in

1
6 5
1 0 1 0 1
1 1 1 1 0
1 0 0 0 0
0 0 0 0 0
0 1 1 1 0
0 0 0 0 0

cort.out

4

Explicație

Pentru primul exemplu cerința este 1. Se pot rearanja sub urmatoarea formă:

1 1 1 0 0

1 1 1 1 0

1 0 0 0 0

1 1 1 0 0

0 0 0 0 0

0 0 0 0 0

Pe coloana 1 există 4 dale negre.

Încărcare soluție

Lipește codul aici

import sys

C = int(sys.stdin.readline())

if C == 1:

    N, M = map(int, sys.stdin.readline().split())

    nr = 0

    for i in range(N):

        ok = 0

        for j in range(M):

            x = int(sys.stdin.readline())

            if x == 1:

                ok = 1

        if ok == 1:

            nr += 1

    sys.stdout.write(str(nr))

if C == 2:

    N, M = map(int, sys.stdin.readline().split())

    v = []

    for i in range(N):

        k = 0

        for j in range(M):

            x = int(sys.stdin.readline())

            k += x

        v.append(k)

    v.sort()

    maxim = 0

    for i in range(len(v)):

        if v[i] * (N - i + 1) > maxim:

            maxim = v[i] * (N - i + 1)

    sys.stdout.write(str(maxim))