Cod sursa(job #1466903)

Utilizator BLz0rDospra Cristian BLz0r Data 31 iulie 2015 17:59:24
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define Nmax 7300
#define Mmax 17
#define inf 0x3f3f3f3f

FILE *f = fopen ( "elimin.in", "r" );
FILE *g = fopen ( "elimin.out", "w" );

short int v[Nmax][Mmax];
int SumLin[Nmax], SumCol[Mmax], s[Nmax], DeScazut[Nmax];

int NrBiti ( int x ){

    int cnt = 0;

    for ( int i = 1; i <= x; i <<= 1 )
        if ( x & i )
            cnt++;
    return cnt;
}

int main(){

    int N, M, R, C, Stot = 0, Sol = -inf;

    fscanf ( f, "%d%d%d%d", &N, &M, &R, &C );

    if ( N < M ){
        for ( int i = 1; i <= N; ++i ){
            for ( int j = 1; j <= M; ++j ){
                fscanf ( f, "%hd", &v[j][i] );
                SumCol[i] += v[j][i];
                SumLin[j] += v[j][i];
                Stot += v[j][i];
            }
        }
        swap ( N, M );
        swap ( R, C );
    }
    else{
        for ( int i = 1; i <= N; ++i ){
            for ( int j = 1; j <= M; ++j ){
                fscanf ( f, "%hd", &v[i][j] );
                SumCol[j] += v[i][j];
                SumLin[i] += v[i][j];
                Stot += v[i][j];
            }
        }
    }

    int go = ( 1 << M );

    for ( int i = 0; i < go; ++i ){

        int nr = NrBiti ( i );

        if ( nr == C ){

            int Saux = Stot;
            memset ( DeScazut, 0, sizeof ( DeScazut ) );

            for ( int j = 1, step = 1; j <= i; j <<= 1, ++step ){

                if ( i & j ){

                    Saux -= SumCol[step];

                    for ( int k = 1; k <= N; ++k )
                        DeScazut[k] += v[k][step];
                }

            }

            for ( int j = 1; j <= N; ++j )
                s[j] = SumLin[j] - DeScazut[j];

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

            for ( int j = 1; j <= R; ++j )
                Saux -= s[j];

            Sol = max ( Sol, Saux );
        }
    }

    fprintf ( g, "%d", Sol );

    return 0;
}