Cod sursa(job #462158)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 9 iunie 2010 21:13:14
Problema Balans Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>

#define file_in "balans.in"
#define file_out "balans.out"

#define nmax 300

int n,m,p,q;
int val;
int a[nmax][nmax];
int sum[nmax][nmax];

void citire()
{
	int i,j;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d %d %d", &n, &m, &p,&q);
	//min=0x3f3f3f3f;
	//max=0;
	for (i=1;i<=n;++i)
		 for (j=1;j<=m;++j)
		 {
			 scanf("%d", &val);
			 //val*=1000;
			 a[i][j]=val;
			 a[i+n][j]=val;
			 a[i][j+m]=val;
			 a[i+n][j+m]=val;
			// if (val>max) max=val;
			// if (val>min) min=val;
		 }
}

void solve()
{
	
	int i,j,k,l;
	//suma partiale
	for (i=1;i<=2*n;++i)
		 for (j=1;j<=2*m;++j)
			  sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
		 
	double sol=-10000.0;
	double suma;	 
	
	for (i=p;i<=n;++i)
         for (j=q;j<=m;++j)
           for (k=n+1;k<=2*n;++k)
			   for (l=m+1;l<=2*m;++l)
              {
			   suma=sum[k][l]-sum[k-i][l]-sum[k][l-j]+sum[k-i][l-j]; 
			  if (sol*(i*j)<suma)
			 	 sol=suma/(i*j);
		 }
	printf("%.3f\n", sol);
}


int main()
{
	citire();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}