Cod sursa(job #2398636)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 5 aprilie 2019 19:58:45
Problema Elimin Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int n, m, r, c;
int a[16][10000];
int calc_de_unde_incep(int r)
{
    int p=1, s=0;
    for(int i=1;i<=r;i++){

        s+=p;
        p=p*2;
    }
    return s;
}
int suma[500];
int testez(int i){

    int s=0;
    int ii=1;
    int pana_la=(1<<n);
    for(int j=1; j<pana_la; j<<=1,ii++)
        if((j&i)==0){
            for(int k=1; k<=m; k++){
                s+=a[ii][k];
                suma[k]+=a[ii][k];
            }
        }
    sort(suma+1,suma+m+1);
    for(int j=1; j<=c;j++)
        s-=suma[j];
    for(int i=1; i<=m; i++)
        suma[i]=0;
    return s;
}

int vmax=-1;
void generez(int x){

    int pana_la=0;
    int p=1;
    for(int i=1; i<=n;i++)
    {
        pana_la+=p;
        p*=2;
    }
    for(int i=x; i<=pana_la; i++){
        int nr1=0;
        for(int j=1; j<=i; j<<=1)
            if((j&i)!=0)
                nr1++;
        if(nr1==r)
            vmax=max(testez(i),vmax);
    }
}
int main() {

    freopen("elimin.in","r",stdin);
    freopen("elimin.out","w",stdout);
    scanf("%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++)
                scanf("%d ",&a[i][j]);
        }
        generez(calc_de_unde_incep(r));
    }
    else{
        for(int i=1; i<=n; i++){
            for(int j=1; j<=m; j++)
                scanf("%d ",&a[j][i]);
        }
        swap(n,m);
        swap(r,c);
        generez(calc_de_unde_incep(r));
    }
    printf("%d",vmax);
    return 0;
}