Cod sursa(job #2030601)

Utilizator edicCiuculescu Eduard edic Data 1 octombrie 2017 20:29:12
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int ma[1000][2000];
int csum[2000],sum[2000];
int calc(int n)
{
    return 1<<n;
}
int main()
{
    freopen("elimin.in","r",stdin);
    freopen("elimin.out","w",stdout);
    int n,m,i,j,r,c,sumax=0,su,ca,s;
    scanf("%d%d%d%d",&n,&m,&r,&c);
    if(n>m)
    {
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                scanf("%d",&ma[m-j+1][i]);
            }
        }
        m+=n;
        n=m-n;
        m-=n;
        r+=c;
        c=r-c;
        r-=c;
    }
    else
    {
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                scanf("%d",&ma[i][j]);
            }
        }
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            csum[j]+=ma[i][j];
        }
    }
    int pa=calc(n);
    for(int a=0;a<=pa-1;a++)
    {
        ca=a;
        s=0;
        while(ca)
        {
            if(ca&1==1)
                s++;
            ca=ca>>1;
        }
        if(s==r)
        {
            for(j=1;j<=m;j++)
            {
                sum[j]=csum[j];
            }
            ca=a;
            for(i=1;i<=n;i++)
            {
                if(ca&1==1)
                {
                    for(j=1;j<=m;j++)
                    {
                        sum[j]-=ma[i][j];
                    }
                }
                ca=ca>>1;
            }
            sort(sum+1,sum+m+1);
            su=0;
            for(i=c+1;i<=m;i++)
            {
                su+=sum[i];
            }
            if(su>sumax)
                sumax=su;
        }
    }
    printf("%d",sumax);
    return 0;
}