Cod sursa(job #2085215)

Utilizator himamisBencze Balazs himamis Data 9 decembrie 2017 20:22:47
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <climits>

using namespace std;
int n, m;
int *mat;
int *rows;
int *cols;
bool r;

int total = 0;

void nullify() {
    for (int i = 0; i < n; i++) {
        rows[i] = 0;
    }
    for (int i = 0; i < m; i++) {
        cols[i] = 0;
    }
}

void be() {
    ifstream f("flip.in");
    f >> n >> m;
    mat = new int[n * m];
    for (int i = 0; i < n * m; i++) {
        f >> mat[i];
    }
    rows = new int[n];
    cols = new int[m];
    f.close();
}

void megold() {
    bool can = true;
    while (can) {
        nullify();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                rows[i] += mat[i * m + j];
                cols[j] += mat[i * m + j];
            }
        }
        int sm = INT_MAX;
        int smi = -1;
        r = true;
        
        for (int i = 0; i < n; i++) {
            if (rows[i] < sm) {
                sm = rows[i];
                smi = i;
            }
        }
        for (int i = 0; i < m; i++) {
            if (cols[i] < sm) {
                sm = cols[i];
                smi = i;
                r = false;
            }
        }
        if (sm >= 0) {
            can = false;
        } else {
            if (r) {
                for (int i = 0; i < m; i++) {
                    mat[smi * m + i] = -mat[smi * m + i];
                }
            } else {
                for (int i = 0; i < n; i++) {
                    mat[i * m + smi] = -mat[i * m + smi];
                }
            }
        }
    }
    for (int i = 0; i < m * n; i++) {
        total += mat[i];
    }
}


void ki() {
    ofstream g("flip.out");
    g << total;
    g.close();
}

int main() {
    be();
    megold();
    ki();
}