Cod sursa(job #121633)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 9 ianuarie 2008 11:03:35
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <fstream.h>
#define MAXLON 1000000000

ifstream fin ("elimin.in");
ofstream fout ("elimin.out");

int a[500][500],n,m,l,c,lin[590],col[590],nrlin,nrcol,lopt[600],copt[600];
long  Slmin=MAXLON,Scmin=MAXLON,Sfinal=0;

void citire()
{
   fin>>n>>m>>l>>c;
   for (int i=0;i<n;i++)
      for (int j=0;j<m;j++)
	 fin>>a[i][j];
   fin.close();
}

void sumal()
{
   long S=0;
     for (int i=0;i<n;i++)
	if (lin[i]==1)
	   for (int j=0;j<m;j++)
		S+=a[i][j];
if (S<Slmin)
 {
    Slmin=S;
    for (int i=0;i<n;i++)
	lopt[i]=lin[i];
 }
}

void backl(int k)
{
   if (k==n)
   {
     if (nrlin==l)
	sumal();
     return ;
   }
   lin[k]=0;
   backl(k+1);
   if (nrlin<l)
   {
      lin[k]=1;
      nrlin++;
      backl(k+1);
      lin[k]=0;
      nrlin--;
   }
}


void sumac()
{
   long S;
      for (int i=0;i<m;i++)
	 if (col[i]==1)
	    for (int j=0;j<n;j++)
		S+=a[j][i];
if (S<Scmin)
 {
    Scmin=S;
       for (int k=0;k<m;k++)
	   copt[k]=col[k];
 }
}

void backc(int k)
{
   if (k==m)
   {
      if (nrcol==c)
	 sumac();
   return ;
   }

   col[k]=0;
   backc(k+1);
     if (nrcol<c)
     {
	col[k]=1;
	nrcol++;
	backc(k+1);
	col[k]=0;
	nrcol--;
     }
}


void sol()
{
    for (int k=0;k<m;k++)
       if (copt[k]==1)
	  for (int u=0;u<n;u++)
	      a[u][k]=0;

   for (int i=0;i<n;i++)
      for (int j=0;j<m;j++)
	  a[i][m]+=a[i][j];

short ok=1,p=n;

while (ok)
  {
     ok=0;
     p--;
	for (int i=0;i<p;i++)
	  {
	     if (a[i][m]>a[i+1][m])
	     {
		for (int k=0;k<=m;k++)
		  {
		     int aux=a[i][k];
		     a[i][k]=a[i+1][k];
		     a[i+1][k]=aux;
		  }
		ok=1;
	     }
	  }
  }

    for (int h=l;h<n;h++)
       for (int j=0;j<m;j++)
	   Sfinal+=a[h][j];
}

void soc()
{
   for (int o=0;o<n;o++)
      if (lopt[o]==1)
	 for (int j=0;j<m;j++)
	    a[o][j]=0;

   for (int i=0;i<m;i++)
      for (int j=0;j<n;j++)
	 a[n][i]+=a[j][i];

short ok=1,p=m;

while (ok)
 {
   ok=0;
   p--;
   for (int i=0;i<p;i++)
      if (a[n][i]>a[n][i+1])
      {
	ok=1;
	   for (int l=0;l<=n;l++)
	   {
	     int aux=a[l][i];
	     a[l][i]=a[l][i+1];
	     a[l][i+1]=aux;
	   }
      }
 }

   for (int h=0;h<n;h++)
      for (int d=c;d<m;d++)
	 Sfinal+=a[h][d];

}

int main()
{
    citire();
      if (c>l)
      {
	 backc(0);
	 sol();
      }
      else
       {
	  backl(0);
	  soc();
       }
       fout<<Sfinal<<"\n";
      fout.close();
      return 0;
}