Cod sursa(job #77104)

Utilizator coderninuHasna Robert coderninu Data 13 august 2007 01:24:16
Problema Elimin Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <stdio.h>
#define infile "elimin.in"
#define outfile "elimin.out"
#define nmax 400
#define inf 999999999
long v[nmax][nmax], n, m, r, c, i, j;
long rez, linii[nmax], coloane[nmax];

void readdata();
void writedata();
void solve();

int main()
{
 readdata();
 solve();
 writedata();
 return 0;
}

void readdata()
{
 freopen(infile, "r", stdin);
 scanf("%ld %ld %ld %ld\n", &n, &m, &r, &c);
 for (i=1; i<=n; i++)
     for (j=1; j<=m; j++)
	 {
	  scanf("%ld ", &v[i][j]);
	  rez+=v[i][j];
	  linii[i]+=v[i][j];
	  coloane[j]+=v[i][j];
	 }
 fclose(stdin);
}

void writedata()
{
 freopen(outfile, "w", stdout);
 printf("%ld", rez);
 fclose(stdout);
}

void solve()
{
 int k, x, y;
 long min;
 for (k=r<c?r:c; k>0; k--, c--, r--)
     {
      min=inf;
      for (i=1; i<=n; i++)
	  for (j=1; j<=m; j++)
	      {
	       if (linii[i]+coloane[j]-v[i][j]<min)
		   {
		    x=i;
		    y=j;
		    min=linii[i]+coloane[j]-v[i][j];
		   }
	      }
      rez-=min;
      for (i=1; i<=n; i++)
	  {
	   linii[i]-=v[i][y];
	   v[i][y]=0;
	  }
      for (i=1; i<=m; i++)
	  {
	   coloane[i]-=v[x][i];
	   v[x][i]=0;
	  }
      linii[x]=coloane[y]=inf;
     }
 for ( ; c; c--)
     {
      min=inf;
      for (i=1; i<=m; i++)
	  if (coloane[i]<min)
	      {
	       min=coloane[i];
	       y=i;
	      }
      rez-=coloane[y];
      coloane[y]=inf;
     }
 for ( ; r; r--)
     {
      min=inf;
      for (i=1; i<=n; i++)
	  if (linii[i]<min)
	      {
	       min=linii[i];
	       x=i;
	      }
      rez-=linii[x];
      linii[x]=inf;
     }
}