Cod sursa(job #2198399)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 24 aprilie 2018 13:53:06
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream in("elimin.in");
ofstream out("elimin.out");

int n, m, r, c;// se da o matrice de n pe m si trebuie sa elimin exact r linii si c coloane
int matr[1000][1000];//matricea contine numere naturale
int linie[1000],sumCol[1000];
int sumMax, nrLin;

void citire(){
    in >> n >> m >> r >> c;
    if(n <= m) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                in >> matr[i][j];
            }
        }
    }else{
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                in >> matr[j][i];
            }
        }
        int temp = r;
        r = c;
        c = temp;
        temp = n;
        n = m;
        m = temp;
    }
}

void quickSort(int st, int dr){
    int i = st, j = dr, pivot = (st + dr)/2;
    while(i <= j){
        while(i <= dr && sumCol[i] < sumCol[pivot]){
            i++;
        }
        while (j >= st && sumCol[j] > sumCol[pivot]){
            j--;
        }
        if(i <= j){
            int temp = sumCol[i];
            sumCol[i] = sumCol[j];
            sumCol[j] = temp;
            i++;
            j--;
        }
    }
    if(i < dr){
        quickSort(i, dr);
    }
    if(j > st){
        quickSort(st, j);
    }

}

void sumaColoane(){
    int sumTemp = 0;

    for(int i = 1; i <= m; i++){
        sumCol[i] = 0;
    }
    for(int i = 1; i <= n; i++){
        if(linie[i] != 0){
            for(int j = 1; j <= m ;j++){
                sumCol[j] = sumCol[j] + matr[i][j];
            }
        }
    }
    //quickSort(1, m);
    sort(sumCol + 1, sumCol + m + 1);
    for(int i = m; i > c; i--){
        sumTemp = sumTemp + sumCol[i];
    }
    if(sumTemp > sumMax){
        sumMax = sumTemp;
    }

}

void bktLinii(int varf, int nrLinElim){
    for(int i = 0; i <= 1; i++){
        if(i == 0){
            nrLinElim++;
        }
        linie[varf] = i;
        if(varf == n){
            if(nrLinElim == r){
                sumaColoane();
            }
        }else{
            bktLinii(varf + 1, nrLinElim);
        }
        if(i == 0){
            nrLinElim--;
        }
    }
}

int main() {
    citire();
    nrLin = n - r;
    bktLinii(1, 0);
    out << sumMax;
    return 0;
}