Cod sursa(job #644178)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 5 decembrie 2011 14:44:35
Problema Elimin Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 1000
int n,m,i,j,a[16][N],r,c,k,x,d,u,l[16],q[N],s[33000],w,h[33000],t,v;

int cmp(int a,int b)
{return a<b;}

int main()
{FILE *f=fopen("elimin.in","r"),*g=fopen("elimin.out","w");
fscanf(f,"%d%d%d%d",&n,&m,&r,&c);
if(n>m)
     {for(i=1;i<=n;i++)
     for(j=1;j<=m;j++)
            fscanf(f,"%d",&a[j][i]);
     x=n,n=m,m=x,x=r,r=c,c=x;}
else
     for(i=1;i<=n;i++)
     for(j=1;j<=m;j++)
            fscanf(f,"%d",&a[i][j]);
for(i=1;i<=(1<<(n-1));i++)
     {s[i<<1]=s[i],s[(i<<1)+1]=s[i]+1;
     if(s[i<<1]==r-1&&r)
             h[++t]=(i<<1);
     if(s[(i<<1)+1]==r-1&&r)
             h[++t]=(i<<1)+1;}
if(r)
     for(k=1;k<=t;k++)
             {for(i=w=0,v=1;i<n&&w<r;i++,v<<=1)
             if(h[k]&v)
                    l[i+1]=1,w++;
             for(j=1;j<=m;j++)
                    q[j]=0;
             for(i=1,d=0;i<=n;i++)
             if(!l[i])
                    for(j=1;j<=m;j++)
                            q[j]+=a[i][j],d+=a[i][j];
             else
                    l[i]=0;
             sort(q+1,q+m+1,cmp);
             for(j=1;j<=c;j++)
                    d-=q[j];
             if(d>u)
                    u=d;}
else
     if(c)
             {for(i=1,u=0;i<=n;i++)
             for(j=1;j<=m;j++)
                    q[j]+=a[i][j],u+=a[i][j];
             sort(q+1,q+m+1,cmp);
             for(j=1;j<=c;j++)
                    u-=q[j];}
fprintf(g,"%d",u);
return 0;}