Cod sursa(job #1408847)

Utilizator retrogradLucian Bicsi retrograd Data 30 martie 2015 11:50:43
Problema Balans Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include<iostream>
#include<fstream>

using namespace std;
typedef int var;

ifstream fin("balans.in");
ofstream fout("balans.out");

double rez = 1e12;
var n, m, l, c;

#define MAXN 500
double A[MAXN][MAXN], S[MAXN][MAXN], B[MAXN][MAXN];
double V[MAXN], SUM[MAXN];

double sum(var l1, var c1, var l2, var c2) {
    return S[l2][c2] - S[l1-1][c2] - S[l2][c1-1] + S[l1-1][c1-1];
}

double solve(double val) {

    double M = -1;

    for(var i=1; i<=2*n; i++) {
        for(var j=1; j<=2*m; j++) {
            B[i][j] = A[i][j] - val;
            S[i][j] = -S[i-1][j-1] + S[i-1][j] + S[i][j-1] + B[i][j];
        }
    }

    for(var dy = l; dy <= n; dy ++) {
        for(var i=dy; i<=2*n; i++) {
            for(var j=1; j<=m; j++) {
                V[j] = sum(i-dy+1, j, i, j);
                V[j+m] = V[j];
            }

            double s = 0;

            for(var j=1; j<=c; j++) {
                s += V[j];
            }
            SUM[c] = s;
            for(var j=c+1; j<=2*m; j++) {
                SUM[j] = SUM[j-1] + V[j] - V[j-c];
            }

            M = max(M, SUM[c]);

            double best = SUM[c];
            for(var j=c+1; j<=2*m; j++) {
                best = max(best + V[j], SUM[j]);
                M = max(M, best);
            }
        }
    }

    return M;

}

int main()
{
    fin>>n>>m>>l>>c;

    for(var i=1; i<=n; i++) {
        for(var j=1; j<=m; j++) {
            fin>>A[i][j];
            A[i][j+m] = A[i+n][j] = A[i+n][i+m] = A[i][j];
        }
    }

    //solve(0);

    double sol = 0;
    for(double i=10000; i> 1e-4; i/=2) {
        if( solve(sol+i) > 0)
            sol += i;
    }

    fout<<sol;

    return 0;
}