Cod sursa(job #68264)

Utilizator sealTudose Vlad seal Data 27 iunie 2007 12:48:36
Problema Elimin Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<stdio.h>
#include<stdlib.h>
#define Nm 7295
#define Mm 16
int M[Nm][Mm],Sl[Nm],Sc[Mm],C[Mm],n,m,r,c,st,sol;

void read()
{
    int i,j;

    freopen("elimin.in","r",stdin);
    scanf("%d%d%d%d",&n,&m,&r,&c);
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            if(m<=n)
                scanf("%d",&M[i][j]);
            else
                scanf("%d",&M[j][i]);
    if(m>n)
    {
        n=n^m;
        m=n^m;
        n=n^m;
        r=r^c;
        c=r^c;
        r=r^c;
    }
}

int cmp(const void *x, const void *y)
{
    return *(int*)x-*(int*)y;
}

void update()
{
    int S[Nm],i,j,s=st;

    for(i=1;i<=n;++i)
        S[i]=Sl[i];
    for(j=1;j<=c;++j)
        s-=Sc[C[j]];
    for(i=1;i<=n;++i)
        for(j=1;j<=c;++j)
            S[i]-=M[i][C[j]];
    qsort(S+1,n,sizeof(int),cmp);
    for(i=1;i<=r;++i)
        s-=S[i];
    if(s>sol)
        sol=s;
}

void back(int k)
{
    if(k==c+1)
        update();
    else
    {
        int i;

        for(i=C[k-1]+1;i<=m-c+k;++i)
        {
            C[k]=i;
            back(k+1);
        }
    }
}

void solve()
{
    int i,j;

    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
        {
            st+=M[i][j];
            Sl[i]+=M[i][j];
            Sc[j]+=M[i][j];
        }
    back(1);
}

void write()
{
    freopen("elimin.out","w",stdout);
    printf("%d\n",sol);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}