Cod sursa(job #7103)

Utilizator VmanDuta Vlad Vman Data 21 ianuarie 2007 12:30:32
Problema Elimin Scor 70
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasa a 10-a Marime 2.12 kb
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int n, m, r, c, aux, i, j, t1[21][3601], t2[3601][21];
long s[1201],ss[1201],pow[21],tot,max;
FILE *f;

void qsort(int l, int r)
{
 long i,j,x,y;
 i=l;
 j=r;
 x=ss[(l+r)/2];
 do
	{
	while ((ss[i]<x)&&(i<m)) ++i;
	while ((x<ss[j])&&(j>1)) --j;
	if (i<=j)
		{
		y=ss[i];ss[i]=ss[j];ss[j]=y;
		++i;
		--j;
		}
	}
 while (i<=j);
 if (l<j) qsort(l,j);
 if (i<r) qsort(i,r);
}

void normal()
{
 long b,p,nr;
 int k;
 p=1 << n;
 b=0;
 while (b<p)
       {
       k=0;
       nr = 0;
       for (i=0;i<n;++i)
	   if ((b^pow[i])<b) ++k;
       if (k==r)
	  {
	  memcpy(ss,s,sizeof(s));
	  for (i=0;i<n;++i)
	      if ((b^pow[i])<b)
		 for (j=1;j<=m;++j)
		     ss[j]-=t1[i+1][j];
	  qsort (1, m);
	  for (i=c+1;i<=m;++i)
	     nr += ss[i];
	  if (nr>max) max=nr;
	  }
	++b;
	}
}

void invers()
{
 long b,p,nr;
 int k;
 p=1 << m;
 b=0;
 while (b<p)
       {
       k=0;
       nr = 0;
       for (i=0;i<m;++i)
	   if ((b^pow[i])<b) ++k;
       if (k==c)
	  {
	  memcpy(ss,s,sizeof(s));
	  for (i=0;i<m;++i)
	      if ((b^pow[i])<b)
		 for (j=1;j<=n;++j)
		     ss[j]-=t2[j][i+1];
	  qsort (1, n);
	  for (i=r+1;i<=n;++i)
	     nr += ss[i];
	  if (nr>max) max=nr;
	  }
	++b;
	}
}


int main()
{
      pow[0]=1;
      max = 0;
      for (i=1;i<21;++i)
	  pow[i] = pow[i-1] << 1;
      f=fopen("elimin.in","r");
      fscanf(f,"%d%d%d%d\n",&n,&m,&r,&c);
      if (n<=m)
	 {
	 for (i=1;i<=n;++i)
	     {
	     for (j=1;j<=m;++j)
		 {
		 fscanf(f,"%d",&t1[i][j]);
		 s[j] += t1[i][j];
		 }
		 //fscanf(f,"\n");
	     }
	     for (i=1;i<=m;++i) tot+=s[i];
	     normal();
	     }
       else
	   {
	   for (i=1;i<=n;++i)
	     {
	     for (j=1;j<=m;++j)
		 {
		 fscanf(f,"%d",&t2[i][j]);
		 s[i] += t2[i][j];
                 }
                 //fscanf(f,"\n");
             }
             for (i=1;i<=n;++i) tot+=s[i];
             invers();
             }
      fclose(f);
      f=fopen("elimin.out","w");
      fprintf(f,"%ld",max);
      fclose(f);
      return 0;
}