Cod sursa(job #1722059)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 27 iunie 2016 10:33:00
Problema Elimin Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <algorithm>
#define MAXN 14
#define MAXC 7294
int m[MAXN+1][MAXC+1], v[MAXC+1];
int main(){
    int nrlin, nrcol, a, b, i, j, aux, l, ans, sum, p;
    FILE *fin, *fout;
    fin=fopen("elimin.in", "r");
    fout=fopen("elimin.out", "w");
    fscanf(fin, "%d%d%d%d", &nrlin, &nrcol, &a, &b);
    if(nrlin<nrcol){
        for(i=1; i<=nrlin; i++){
            for(j=1; j<=nrcol; j++){
                fscanf(fin, "%d", &m[i][j]);
            }
        }
    }else{
        for(i=1; i<=nrlin; i++){
            for(j=1; j<=nrcol; j++){
                fscanf(fin, "%d", &m[j][i]);
            }
        }
        aux=nrlin;
        nrlin=nrcol;
        nrcol=aux;
        aux=a;
        a=b;
        b=aux;
    }
    ans=0;
    for(i=0; i<(1<<nrlin)-1; i++){
        p=0;
        for(j=0; j<nrlin; j++) p+=((i&(1<<j))!=0);
        if(p==a){
            for(l=1; l<=nrlin; l++){
                if((i&(1<<(l-1)))==0){
                    for(j=1; j<=nrcol; j++) v[j]+=m[l][j];
                }
            }
            std::sort(v+1, v+nrcol+1);
            sum=0;
            for(j=nrcol; j>b; j--){
                sum+=v[j];
                v[j]=0;
            }
            for(j=nrcol-b; j>0; j--) v[j]=0;
            if(sum>ans) ans=sum;
        }
    }
    fprintf(fout, "%d\n", ans);
    fclose(fin);
    fclose(fout);
    return 0;
}