Cod sursa(job #3352478)

Utilizator mariusn01Marius Nicoli mariusn01 Data 28 aprilie 2026 10:10:09
Problema Jocul Flip Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.41 kb
/**
Observatia principala:
- are sens sa facam flip de 2 ori pe aceeasi linie (sau aceeasi coloana) ?
Raspus: Nu pentru ca e acelasi lucru ca si cand nu facem deloc flip.

Fiecarei linii si fiecarei coloane fie nu ii facem deloc flip fie ii facem o singura data.

imi aleg o dimensiune, sa zicem coloanele. Numarul de coloane este mic si voi analiza toate modurile
de a face flip pe coloane
0  0  0
4 -2  2
3 -1  5
2 0  -3
4 1  -3
5 -3  2

0  0  1
4 -2 -2
3 -1 -5
2 0  +3
4 1  +3
5 -3 -2

0  1  0
4 +2  2
3 +1  5
2  0 -3
4 -1 -3
5 +3  2

0  1  1
4 +2 -2
3 +1 -5
2  0 +3
4 -1 +3
5 +3 -2
...

 1  1  1
-4 +2 -2
-3 +1 -5
-2  0 +3
-4 -1 +3
-5 +3 -2

Costa mult sa iau in calcul toate aceste configuratii ? R: 2 la 16 maxim (inmultit cu n*m)
**/

#include <fstream>
using namespace std;
int a[16][16], c[16][16];
int n, m, i, j, b, k, slin, scurent, smax;
int main () {
    ifstream fin ("flip.in");
    ofstream fout("flip.out");

    fin>>n>>m;
    for (i=0;i<n;i++)
        for (j=0;j<m;j++)
            fin>>a[i][j];

    /// iau k de la 0 la numar de coloane - 1
    for (k=0;k<(1<<m);k++) {
        /// aplic flip pe coloane conform scrierii in baza 2 a lui k
        /// mai intereseaza bitii lui k de la 0 la m-1

        for (i=0;i<n;i++)
            for (j=0;j<m;j++)
                c[i][j] = a[i][j];

        /// ma intereseaza bitii 1 din scrierea in baza 2 a lui k
        for (b=0;b<m;b++) {
            if ((k>>b) & 1) {
                /// fac flip la coloana b din matrice (dar intr-o matrice copie)
                for (i=0;i<n;i++)
                    c[i][b] = -c[i][b];
            }
        }

        /// pentru masca curenta de flip aplicata pe coloane
        /// liniilor care au suma negativa le fac flip si pe celelalte le las asa
        scurent = 0;
        for (i=0;i<n;i++) {
            slin = 0;
            for (j=0;j<m;j++)
                slin += c[i][j];
            if (slin < 0)
                scurent -= slin;
            else
                scurent += slin;
        }

        if (scurent > smax)
            smax = scurent;

        /**
        for (i=0;i<n;i++) {
            for (j=0;j<m;j++)
                fout<<c[i][j]<<" ";
            fout<<"\n";
        }
        fout<<"\n";
        **/
    }
    fout<<smax;
}
/**
Timp de calcul de ordin ((2 la m) * n * m).
65000 * 256
2 la 24 = 16 milioane, OK!
**/