Cod sursa(job #8600)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 25 ianuarie 2007 00:32:56
Problema Elimin Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<stdio.h>
long sir1[70],sir2[8010],bur[8010],bur2[70],n,m,var1,var2,i,j,k,ok,sum,min,s,poz,max;
int bin[70],a[70][8000];
long partition(long p2 , long q2)
{
 long i=p2-1,aux,j;
 for(j=p2;j<=q2;j++)
  if (sir2[j]<=sir2[q2])
   {
    i++;
    aux=sir2[i];
    sir2[i]=sir2[j];
    sir2[j]=aux;
   }
  return i;
}
long qsort(long p2 , long q2)
{
 long x;
 if (p2<q2)
  {
  x=partition(p2,q2);
  qsort(p2,x-1);
  qsort(x+1,q2);
  }
  return 0;
}
int main()
{
 freopen("elimin.in","r",stdin);
 freopen("elimin.out","w",stdout);
 scanf("%ld %ld %ld %ld",&n,&m,&var1,&var2);
 if (n>m)
 {
  for(i=1;i<=n;i++)
   for(j=1;j<=m;j++)
    scanf("%ld",&a[j][i]);
 ok=n;
 n=m;
 m=ok;
 ok=var1;
 var1=var2;
 var2=ok;
 }
 else
  {
    for(i=1;i<=n;i++)
   for(j=1;j<=m;j++)
    scanf("%ld",&a[i][j]);
  }
 for(i=1;i<=n;i++)
  for(j=1;j<=m;j++)
  {
   sir1[i]+=a[i][j];
   bur2[i]+=a[i][j];
   sir2[j]+=a[i][j];
   bur[j]+=a[i][j];
  }
 bin[1]=-1;
 while (bin[n+1]==0)
 {
 bin[1]++;
 for(k=1;bin[k]>1;bin[k]=0,bin[++k]++);
 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]) s+=sir1[j];
      else
      {
      sum++;
      if ((sum>var1)||((sum+n-j)<var1)) break;
       for(k=1;k<=m;k++)
        sir2[k]-=a[j][k];
      }
 if ((sum==var1)&&(!ok))
   {
   qsort(1,m);
   for(j=1;j<=var2;j++)
    s-=sir2[j];
   if (s>max) max=s;
   }
 }
 printf("%ld",max);
 printf("\n");
 fclose(stdout);
}