Cod sursa(job #2307002)

Utilizator mihaicivMihai Vlad mihaiciv Data 23 decembrie 2018 15:52:17
Problema Elimin Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stdlib.h>
using namespace std;
int sMin;
int a[5000][100], v[5000];
int r, c;
int colSum[5000];
int n, m;
void prelucrare(int **a) {

    for (int i = 1; i <= n; ++i) {
        int pos = 1;
        colSum[i] = 0;
        for (int j = 1; j <= m; ++j) {
            if (v[pos] == j) {
                pos ++;
            } else {
                colSum[i] += a[i][j];
            }
        }
    }
    sort(colSum + 1, colSum + n + 1);
    int currentSum = 0;
    for (int i = 1; i <= r; ++i) {
        currentSum += colSum[i];
    }
    for (int j = 1; j <= c; ++j) {
        for (int i = 1; i <= n; ++i) {
            currentSum += a[i][v[j]];
        }
    }
    sMin = min (sMin, currentSum);
}

void BK(int k, int **a) {

    for (int i = v[k - 1] + 1; i <= m; ++i) {
        v[k] = i;
        if (k == c) {
            prelucrare(a);
        } else { BK(k + 1, a); }
    }

}

int main() {

    ifstream f("elimin.in");
    ofstream g("elimin.out");
    f >> n >> m >> r >> c;
    int b[n + 1][m + 1];
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            f >> b[i][j];
        }
    }
    int **a = (int**) malloc( (max(n, m) + 1) * sizeof(int*));
    for (int i = 0; i <= max(n, m); ++i) {
        a[i] = (int*) malloc((min(n, m) + 1) * sizeof(int));
    }
    // generez minim pentru coloane
    if (m > n) {
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                a[j][i] = b[i][j];
            }
        }
        swap(n, m);
        swap(r, c);
    } else {
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                a[i][j] = b[i][j];
            }
        }
    }
    sMin = 10000000;
    BK(1, a);
    int totalSum = 0;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            totalSum = totalSum + a[i][j];
        }
    }
    g << totalSum - sMin;



    return 0;
}