Cod sursa(job #2306995)

Utilizator mihaicivMihai Vlad mihaiciv Data 23 decembrie 2018 15:41:54
Problema Elimin Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
int sMin;
int a[1000][1000], v[5000];
int r, c;
int colSum[5000];
int n, m;
void prelucrare() {

    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) {

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

}

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];
        }
    }
    // 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);
    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;
}