Cod sursa(job #1971058)

Utilizator DragosArseneDragos Arsene DragosArsene Data 19 aprilie 2017 19:54:16
Problema Elimin Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int v[1001];
int el[1001][1001];
int main() {
    FILE *fin, *fout;
    int n, m, r, c, i, j, k, x, min, a;
    long long max=0, st=0, stotal=0;

fin = fopen("elimin.in", "r");
fout = fopen("elimin.out", "w");
fscanf(fin,"%d%d%d%d", &m, &n, &r, &c);
if(n<m)
    min=n;
else
    min=m;
for(i=1;i<=n;i++){
    for(j=1;j<=m;j++){
        fscanf(fin,"%d", &el[i][j]);
        el[i][0]+=el[i][j];
        el[0][j]+=el[i][j];
        stotal+=el[i][j];
    }
}


a=1;
for(i=1;i<=min;i++){
    a*=2;
}



if(min==n){
for(i=1;i<=a;i++){
    j=i;
    x=0;
    st=stotal;
while(j>0){
    if((j&1)==1)
        x++;
    j=j>>1;
}

    j=i;
    if(x==r){
        x=0;
        for(k=1;k<=m;k++){
            v[k]=el[0][k];
        }

        while(j>0){
            x++;
            if((j&1)==1)
                for(k=1;k<=n;k++){
                    v[k]=v[k]-el[x][k];
                    st-=el[x][k];
                }
            j=j>>1;
            }
            sort(v+1,v+m+1);
            for(k=1;k<=c;k++){
                st-=v[k];
            }
            for(k=1;k<=m;k++){
                v[k]=0;
            }
            if(st>max)
                max=st;
        }

    }

}
else{
for(i=1;i<=a;i++){
    j=i;
    x=0;
    st=stotal;
while(j>0){
    if((j&1)==1)
        x++;
    j=j>>1;
}
    j=i;
    if(x==c){
        x=0;
            for(k=1;k<=n;k++){
                v[k]=el[k][0];
            }
            while(j>0){
                x++;
                if((j&1)==1)
                    for(k=1;k<=m;k++){
                        v[k]-=el[k][x];
                        st-=el[k][x];
                    }
            j=j>>1;
            }
            sort(v+1,v+n+1);
            for(k=1;k<=r;k++){
                st-=v[k];
            }
            for(k=1;k<=n;k++){
                v[k]=0;
            }
            if(st>max)
                max=st;
        }

    }

}

fprintf(fout,"%lld", max);

fclose(fin);
fclose(fout);
    return 0;
}