Cod sursa(job #1165485)

Utilizator DenisacheDenis Ehorovici Denisache Data 2 aprilie 2014 18:43:41
Problema Elimin Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int Mat[7300][17],i,j,n,m,St;
int R,C,v[7300],l,nrbiti[33000];
bool q[105];
int RezFinal;
int cmp(const void *a,const void *b)
{
    int arg1 = *reinterpret_cast<const int*>(a);
    int arg2 = *reinterpret_cast<const int*>(b);
    if (arg1<arg2) return -1;
    if (arg1>arg2) return 1;
    return 0;
}
int main()
{
    freopen("elimin.in","r",stdin);
    freopen("elimin.out","w",stdout);
    scanf("%d %d %d %d",&n,&m,&R,&C);
    if (m<n)
    {
        for (i=1;i<=n;i++)
           for (j=1;j<=m;j++)
           {scanf("%d",&Mat[i][j]); St+=Mat[i][j];}
    }
    else
    {
        for (i=1;i<=n;i++)
            for (j=1;j<=m;j++)
            {scanf("%d",&Mat[j][i]); St+=Mat[j][i];}
        swap(n,m); swap(R,C);
    }
    int nrsub=(1<<m);
    for (i=1;i<nrsub;i++)
    {
        nrbiti[i]=nrbiti[i>>1];
        if (i&1) ++nrbiti[i];
    }
    for (i=0;i<nrsub;i++)
    {
        if (nrbiti[i]==C)
        {
            j=i; l=0; while(j){if (j&1) q[++l]=1; else q[++l]=0; j>>=1;}
            int S=St;
            for (j=1;j<=m;j++)
                if (q[j])
                for (register int x=1;x<=n;x++)
                    S-=Mat[x][j];
            for (j=1;j<=n;j++)
            {v[j]=0;
                 for (register int x=1;x<=m;x++)
                    v[j]+=Mat[j][x]*(!q[x]);}
            qsort(v,n+1,sizeof(int),cmp);
            for (j=1;j<=R;j++)
                S-=v[j];
            if (S>RezFinal) RezFinal=S;
        }
    }
    printf("%d",RezFinal);
    return 0;
}