Cod sursa(job #1751522)

Utilizator calin1Serban Calin calin1 Data 1 septembrie 2016 15:19:35
Problema Elimin Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <iostream>
#include <cstdio>
#include <bitset>
#include <cstring>
#include <algorithm>

using namespace std;

int n,m,r,c,sum_tot,maxim;
int mat[90][3700];
int linii_alese[90];

bitset<100> viz;
void pune_bitset()
{
    for(int i = 1 ; i <= r ; ++i)
    {
        viz[linii_alese[i]] = true;
    }
}

void reset()
{
    for(int i = 1 ; i <= n ; ++i)
    {
        viz[i] = false;
    }
}

void linii(int &tmp_sum)
{
    int tmp;

    for(int i = 1 ; i <= r ; ++i)
    {
        tmp = 0;

        for(int j = 1 ; j <= m ; ++j)
        {
            tmp += mat[linii_alese[i]][j];
        }
        tmp_sum -= tmp;
    }
}

void coloane(int tmp_sum)
{
    int sum_col[3700];

    memset(sum_col,0,sizeof(sum_col));

    for(int i = 1 ; i <= n ; ++i)
    {
        if(viz[i])
        {
            continue;
        }

        for(int j = 1 ; j <= m ; ++j)
        {
            sum_col[j] += mat[i][j];
        }
    }

    sort(sum_col + 1, sum_col + m + 1);

    for(int i = 1 ; i <= c ; ++i)
    {
        tmp_sum -= sum_col[i];
    }

    if(tmp_sum > maxim)
    {
        maxim = tmp_sum;
    }

}

void alegere()
{
    int tmp_sum = sum_tot;

    for(int i = 1 ; i <= r ; ++i)
    {
        linii_alese[i] = i;
    }

    pune_bitset();

    linii(tmp_sum);

    coloane(tmp_sum);

    bool crescubil = true;

    while(crescubil)
    {
        reset();

        tmp_sum = sum_tot;

        crescubil = false;

        for(int i = r ; i > 0 ; --i)
        {
            if(linii_alese[i] < n - (r - i))
            {
                crescubil = true;

                linii_alese[i]++;

                for(int j = i + 1 ; j <= r ; ++j)
                {
                    linii_alese[j] = linii_alese[i] + (j - i);
                }

                pune_bitset();

                linii(tmp_sum);

                coloane(tmp_sum);

                break;

            }
        }
    }

}

void citire()
{
    scanf("%d %d %d %d\n",&n,&m,&r,&c);

    bool invers = false;

    if(n > m)
    {
        invers = true;
    }

    for(int i = 1 ; i <= n ; ++i)
    {
        for(int j = 1 ; j <= m ; ++j)
        {
            if(invers)
            {
                scanf("%d ", &mat[j][i]);
                sum_tot += mat[j][i];
            }
            else
            {
                scanf("%d ", &mat[i][j]);
                sum_tot += mat[i][j];
            }
        }
    }

    if(invers)
    {
        int aux = n;
        n = m;
        m = aux;
    }

    alegere();
}

int main()
{
    freopen("elimin.in","r",stdin);
    freopen("elimin.out","w",stdout);

    citire();
    printf("%d",maxim);

    return 0;
}