Cod sursa(job #955740)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 1 iunie 2013 13:58:37
Problema Elimin Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

short int n, m, r, c, a[700][700], d;
long maxim;
vector <long> sol;
bool car[700], ok;

void Calculare1()
{
    long sum = 0;
    for(int j=1; j<=m; j++)
    {
        long s = 0;
        for(int i=1; i<=n; i++)
        if(!car[i]) s += a[i][j];

        sol.push_back(s);
        sum += s;
    }

    nth_element(sol.begin(), sol.begin()+c, sol.end());
    for(int i=0; i<c; i++)
    sum -= sol[i];
    sol.clear();

    if(maxim < sum) maxim = sum;

}

void Calculare2()
{
    long sum = 0;
    for(int i=1; i<=n; i++)
    {
        long s = 0;
        for(int j=1; j<=m; j++)
        if(!car[j]) s += a[i][j];

        sol.push_back(s);
        sum += s;
    }

    nth_element(sol.begin(), sol.begin()+c, sol.end());
    for(int i=0; i<r; i++)
    sum -= sol[i];
    sol.clear();

    if(maxim < sum) maxim = sum;
}

void Back(int k)
{
    if(k == d+1)
        if(ok)Calculare2();
        else Calculare1();
    else
        for(int j=1; j<=n; j++)
        if(!car[j])
        {
            car[j] = 1;
            Back(k+1);
            car[j] = 0;
        }
}

int main()
{
    fin>>n>>m>>r>>c;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            fin>>a[i][j];

    if(c < r) d = c, ok = 1;
    else d = r;

    Back(1);

    fout<<maxim;

    return 0;
}