Cod sursa(job #422026)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 22 martie 2010 00:56:06
Problema Balans Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
# include <stdio.h>

# define MAXN 150

long int a[2*MAXN+1][2*MAXN+1],sum[2*MAXN+1][2*MAXN+1];
long int n,m,r,c;

void citire()
{
	FILE *f=fopen("balans.in","r");
	fscanf(f,"%ld%ld%ld%ld",&n,&m,&r,&c);
	long int i,j;
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
			{
			fscanf(f,"%ld",&a[i][j]);
			a[i+n][j]=a[i][j];
			a[i][j+m]=a[i][j];
			a[i+n][j+m]=a[i][j];
			}
	fclose(f);
	for (i=1;i<=2*n;i++)
		for (j=1;j<=2*m;j++)
			sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
}

void scrie(float sol)
{
	FILE *g=fopen("balans.out","w");
	fprintf(g,"%.3f\n",sol);
	fclose(g);
}

float calculeaza()
{
	long int i,j,k,l;
	float sol = sum[r][c]/(r*c),solloc,supk,supl;
	//in patratul original
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
			for (k=0;k<=i-r;k++) 
				for (l=0;l<=j-c;l++) 
					{
					//printf("(%ld %ld) -> (%ld %ld)\n",k,l,i,j);
					solloc = ((float)(sum[i][j]-sum[k][j]-sum[i][l]+sum[k][l]))/((i-k)*(j-l));
					if (solloc > sol)
						sol = solloc;
					}
	//in patratul de dedesubt
	for (i=n+1;i<=n+r;i++)
		for (j=1;j<=m;j++)
			for (k=i-n;k<=i-r;k++) 
				for (l=0;l<=j-c;l++) 
					{
					//printf("(%ld %ld) -> (%ld %ld)\n",k,l,i,j);
					solloc = ((float)(sum[i][j]-sum[k][j]-sum[i][l]+sum[k][l]))/((i-k)*(j-l));
					if (solloc > sol)
						sol = solloc;
					}
	//in patratul din dreapta
	for (i=1;i<=n;i++)
		for (j=m+1;j<=m+c;j++)
			for (k=0;k<=i-r;k++) 
				for (l=j-m;l<=j-c;l++) 
					{
					//printf("(%ld %ld) -> (%ld %ld)\n",k,l,i,j);
					solloc = ((float)(sum[i][j]-sum[k][j]-sum[i][l]+sum[k][l]))/((i-k)*(j-l));
					if (solloc > sol)
						sol = solloc;
					}
	//in patratul din diagonala
	for (i=n+1;i<=n;i++)
		for (j=m+1;j<=m;j++)
			for (k=i-n;k<=i-r;k++) 
				for (l=j-m;l<=j-c;l++) 
					{
					//printf("(%ld %ld) -> (%ld %ld)\n",k,l,i,j);
					solloc = ((float)(sum[i][j]-sum[k][j]-sum[i][l]+sum[k][l]))/((i-k)*(j-l));
					if (solloc > sol)
						sol = solloc;
					}
	return sol;
}

int main()
{
	citire();
	float sol = calculeaza();
	scrie(sol);
	return 0;
}