Cod sursa(job #1017521)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 27 octombrie 2013 20:44:30
Problema Elimin Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

const int Nmax = 1000;

int N, M, R, C, sum_max = -1e8, total_sum;
int A[Nmax * 10][30];
int randuri[Nmax * 10];
int sum_rand[Nmax * 10];
int aux[Nmax * 10];

inline void scan( int &n )
{
    n = 0;

    int ch = getchar();
    int sign = 1;

    while ( ch < '0' || ch > '9' )
    {
        if ( ch == '-')
            sign = -1;

        ch = getchar();
    }

    while (  ch >= '0' && ch <= '9' )
    {
        n = ( n << 3 ) + ( n << 1) + ch - '0';
        ch = getchar();
    }

    n = n * sign;
}

void read()
{
    freopen("elimin.in", "r", stdin);

    scan( N );
    scan( M );
    scan( R );
    scan( C );

    if ( N >= M )
    {
        for ( int i = 1; i <= N; ++i )
                for ( int j = 1; j <= M; ++j )
                        scan( A[i][j] );
    }
    else
    {
        for ( int i = 1; i <= N; ++i )
                for ( int j = 1; j <= M; ++j )
                        scan( A[j][i] );

        swap( N, M );
        swap( R, C );
    }

    for ( int i = 1; i <= N; ++i )
                for ( int j = 1; j <= M; ++j )
                        randuri[i] += A[i][j];

    fclose( stdin );
}

void solve()
{
    int suma = 0;

    for ( int i = 1; i <= N; ++i )
    {
        aux[i] = randuri[i] - sum_rand[i];
    }

    sort( aux + 1, aux + 1 + N );

    for ( int i = N; i >= R + 1; i-- )
    {
        suma += aux[i];
    }

    sum_max = max( suma, sum_max );
}

void back()
{
    int lim = 1 << M;

    for ( int i = 0; i < lim; ++i )
    {
        int s = 0;

        for ( int j = 0; j < M; ++j )
        {
            if ( i & ( 1 << j ) )
            {
                s++;

                for ( int k = 1; k <= N; ++k )
                {
                    sum_rand[k] += A[k][j + 1];
                }
            }
        }

        if ( s == C )
        {
            solve();

            for ( int k = 1; k <= N; ++k )
            {
                sum_rand[k] = 0;
            }
        }
    }
}

void print()
{
    freopen("elimin.out", "w", stdout);

    printf("%d\n", sum_max);

    fclose( stdout );
}

int main()
{
    read();
    back();
    print();

    return 0;
}