Cod sursa(job #2193672)

Utilizator ancabdBadiu Anca ancabd Data 10 aprilie 2018 21:39:48
Problema Balans Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <vector>
#include <iomanip>

using namespace std;

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

int n, m, r, c;
double Smax;

vector< vector<int> > A;

int CalcSum(int i1, int i2, int j1, int j2)
{
    return A[i2][j2] - A[i1 - 1][j2] - A[i2][j1 - 1] + A[i1 - 1][j1 - 1];
}

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

    A = vector< vector<int> >(2 * n + 1, vector<int>(2 * m + 1));
    for (int i = 1; i <= n; i ++)
        for (int j = 1; j <= m; j ++)
        {
            fin >> A[i][j];
            A[i + n][j] = A[i][j + m] = A[i + n][j + m] = A[i][j];
        }

    for (int i = 1; i <= 2 * n; i ++)
        for (int j = 1; j <= 2 * m; j ++)
            A[i][j] += A[i - 1][j] + A[i][j - 1] - A[i - 1][j - 1];

    double S;

    for (int i1 = 1, i2; i1 <= n; i1 ++)
        for(int i2 = i1 + r - 1; i2 <= i1 + n; i2 ++)
        {
            for (int j1 = 1; j1 <= m; j1 ++)
                for (int j2 = j1 + c - 1; j2 <= j1 + m; j2 ++)
                {
                    S = 1.00 * CalcSum(i1, i2, j1, j2);
                    int R = i2 - i1 + 1, C = j2 - j1 + 1;
                    if (S / (R * C) > Smax)Smax = S / (R * C);
                }
        }

    int Rez = Smax * 1000;

    fout << fixed << setprecision(3) << 1.00 * Rez / 1000;
    return 0;
}