Cod sursa(job #593767)

Utilizator SpiderManSimoiu Robert SpiderMan Data 4 iunie 2011 15:05:56
Problema Balans Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
# include <cstdio>
# include <cmath>

const char *FIN = "balans.in", *FOU = "balans.out" ;
const int MAX = 315 ;

int A[MAX][MAX], sp[MAX][MAX] ;
int N, M, R, C ;
double sol ;

inline int max (int A, int B) {
    return (A > B ? A : B) ;
}

inline double max (double A, double B) {
    return (A > B ? A : B) ;
}

int main (void) {
    freopen (FIN, "r", stdin) ;

    scanf ("%d %d %d %d", &N, &M, &R, &C) ;
    for (int i = 1; i <= N; ++i) {
        for (int j = 1; j <= M; ++j) {
            scanf ("%d", A[i] + j) ;
            A[i + N][j] = A[i][j + M] = A[i + N][j + M] = A[i][j] ;
        }
    }
    for (int i = R; i <= N << 1; ++i) {
        for (int j = C; j <= M << 1; ++j) {
            sp[i][j] = A[i][j] + sp[i - 1][j] + sp[i][j - 1] - sp[i - 1][j - 1] ;
        }
    }
    for (int r = R; r <= N; ++r) {
        for (int c = C; c <= M; ++c) {
            int maxim = 0;
            for (int i = N + 1; i <= N << 1; ++i) {
                for (int j = M + 1; j <= M << 1; ++j) {
                    maxim = max (maxim, sp[i][j] + sp[i - r][j - c] - sp[i - r][j] - sp[i][j - c]) ;
                }
            }
            sol = max (sol, maxim / (1.0 * r * c)) ;
        }
    }
    fprintf (fopen (FOU, "w"), "%.3lf\n", floor (sol * 1000) / 1000.0) ;
}