Cod sursa(job #186683)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 28 aprilie 2008 17:00:48
Problema Balans Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <cstdio>
#define MAX_N 310

int A[MAX_N][MAX_N];
int B[MAX_N][MAX_N];
int i,j,k,l,n,m,r,c;
double rez;

double max(double a, double b) { return a<b?b:a; }

int main() {
	freopen("balans.in", "r", stdin);
	scanf("%d %d %d %d", &n, &m, &r, &c);
	for ( i=1; i<=n; ++i )
		for ( j=1; j<=m; ++j ) {
			scanf("%d", A[i]+j);
			A[i+n][j] = A[i][j+n] = A[i+n][j+n] = A[i][j];
		}
	n *=2, m *= 2;
	for ( i=1; i<=n; ++i ) B[i][1] = A[i][1];
	for ( j=1; j<=m; ++j ) B[1][j] = A[1][j];
	for ( i=2; i<=n; ++i ) 
		for ( j=2; j<=m; ++j ) 
			B[i][j] = A[i][j] + B[i-1][j]+B[i][j-1] - B[i-1][j-1];

	rez = 0;
	for ( i=1; i<=n; ++i )
		for ( j=1; j<=m; ++j )
			for ( k=i+r-1; k<=n; ++k )
				for ( l=j+c-1; l<=m; ++l ) {
					double v = B[k][l] + B[i-1][j-1] - B[k][j-1] - B[i-1][l];
					v /= (k-i+1)*(l-j+1);
					rez = max(rez, v);
				}

	fprintf(fopen("balans.out", "w"),"%d.%.0d\n", (int)rez, (int)((rez-(int)rez)*1000));
	return 0;
}