Cod sursa(job #6920)

Utilizator robbyRobertino robert robby Data 21 ianuarie 2007 10:52:30
Problema Elimin Scor 20
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasa a 9-a si gimnaziu Marime 1.71 kb
#include <stdio.h>
#include <stdlib.h>
FILE *f,*g;
int **a;
long **s,*sl,*sc;

int compare(const void *a,const void *b)
{
   return (*(long*)a-*(long*)b);
}

int main()
{
   int n,m,i,j,r,c,mini,minj;
   long suma,min;
   FILE *f=fopen("elimin.in","rt");
   FILE *g=fopen("elimin.out","wt");
   fscanf(f,"%d %d %d %d",&m,&n,&r,&c);
   a=(int**)calloc(m,sizeof(int));
   s=(long**)calloc(m,sizeof(long));
   suma=0;
   sl=(long*)calloc(m,sizeof(long));
   sc=(long*)calloc(n,sizeof(long));

   for (i=0;i<m;i++)
	{
	  a[i]=(int*)calloc(n,sizeof(int));
	  s[i]=(long*)calloc(n,sizeof(long));
	  for (j=0;j<n;j++)
		{
		  fscanf(f,"%d",&a[i][j]);
		  s[i][j]=-(long)a[i][j];
		  suma+=a[i][j];
		  sl[i]+=(long)a[i][j];
		  sc[j]+=(long)a[i][j];
		}
	}

   if (r>0&&c>0)
	 {
	   while (r>0&&c>0)
		 {
		   i=0;
		   while (sl[i]<0&&i<m-1)
			 i++;
		   j=0;
		   while (s[j]<0&&j<n-1)
			 j++;
		   min=sl[i]+sc[j]-a[i][j];
		   mini=i;
		   minj=j;

		   for (i=0;i<m;i++)
			 for (j=0;j<n;j++)
			   if (sl[i]+sc[j]-a[i][j]<min&&sl[i]>0&&sc[j]>0)
				 {
				   min=sl[i]+sc[j]-a[i][j];
				   mini=i;
				   minj=j;
				 }
		   suma-=min;
		   sl[mini]=-1;
		   sc[minj]=-1;
		   for (i=0;i<m;i++)
			 sl[i]-=a[i][minj];
		   for (j=0;j<n;j++)
			 sc[j]-=a[mini][j];
		   r--;
		   c--;
		 }
	 }

   i=0;
   if (r>0)
	 qsort(sl,m,sizeof(long),compare);
   while (r>0)
	 {

	   while (sl[i]<0)
		 i++;
	   suma-=sl[i];
	   i++;
	   r--;
	 }

   j=0;
   if (c>0)
	 qsort(sc,n,sizeof(long),compare);
   while (c>0)
	 {
	   while (sc[j]<0)
		 j++;
	   suma-=sc[j];
	   j++;
	   c--;
	 }
   fprintf(g,"%ld\n",suma);
   fclose(f);
   fclose(g);
   return 0;
}