Cod sursa(job #7772)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 22 ianuarie 2007 17:05:05
Problema Elimin Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include<stdio.h>
long sir1[1000],sir2[1000],bur[1000],bur2[1000],n,m,var1,var2,i,j,k,ok,sum,min,s,poz,max;
int bin[400];
int a[1010][1010];
int main()
{
 freopen("elimin.in","r",stdin);
 freopen("elimin.out","w",stdout);
 scanf("%ld %ld %ld %ld",&n,&m,&var1,&var2);
 for(i=1;i<=n;i++)
  for(j=1;j<=m;j++)
  {
   scanf("%ld",&a[i][j]);
   bur2[i]+=a[i][j];
   sir1[i]+=a[i][j];
   sir2[j]+=a[i][j];
   bur[j]+=a[i][j];

  }
 i=1;
 if (n<=m)
 while (bin[n+1]==0)
 {
 bin[i]++;
 k=i;
 while (bin[k]>1) {bin[k]=0;bin[++k]++;}
 if (k==n+1) break;
 ok=0;
 s=0;
 sum=0;
 for(j=1;j<=m;j++)
  sir2[j]=bur[j];
 for(j=1;j<=n;j++)
  if (bin[j]==0) s+=sir1[j];
      else
      {
      sum++;
      if (sum>var1) {ok=1;break;}
       for(k=1;k<=m;k++)
        sir2[k]-=a[j][k];
      }
 if (sum!=var1) ok=1;
 if (!ok)
 {
 for(j=1;j<=var2;j++)
 {
  min=1000000000;
  for(k=1;k<=m;k++)
   if (min>sir2[k]) {min=sir2[k];poz=k;}
 sir2[poz]=1000000000;
 s-=min;
 }
 if (s>max) max=s;
}
 }
 else
  {
   while (bin[m+1]==0)
 {
 bin[i]++;
 k=i;
 while (bin[k]>1) {bin[k]=0;bin[++k]++;}
 if (k==m+1) break;
 ok=0;
 s=0;
 sum=0;
 for(j=1;j<=n;j++)
  sir1[j]=bur2[j];
 for(j=1;j<=m;j++)
  if (bin[j]==0) s+=sir2[j];
      else
      {
      sum++;
      if (sum>var2) {ok=1;break;}
       for(k=1;k<=n;k++)
        sir1[k]-=a[k][j];
      }
 if (sum!=var2) ok=1;
 if (!ok)
 {
 for(j=1;j<=var1;j++)
 {
  min=1000000000;
  for(k=1;k<=n;k++)
   if (min>sir1[k]) {min=sir1[k];poz=k;}
  sir1[poz]=1000000000;
 s-=min;
 }
 if (s>max) max=s;
}
 }
  }
 printf("%ld",max);
 printf("\n");
 fclose(stdout);
}