Cod sursa(job #2453026)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 2 septembrie 2019 11:09:43
Problema Balans Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#include <fstream>
#include <iomanip>

using namespace std;

ofstream g("balans.out");

const int NMAX = 151;

int N, M, L, C;

long long A[2 * NMAX][2 * NMAX];

long long ansa, ansb;

static inline long long Sum (int x1, int y1, int x2, int y2)
{
    return A[x2][y2] - A[x2][y1 - 1] - (A[x1 - 1][y2] - A[x1 - 1][y1 - 1]);
}

int main ()
{
    freopen("balans.in", "r", stdin);

    scanf("%d%d%d%d", &N, &M, &L, &C);

    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= M; ++j)
            scanf("%d", &A[i][j]);

    for(int i = 1; i < N; ++i)
        for(int j = 1; j < M; ++j)
            A[i][j + M] = A[i + N][j] = 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];

    for(int l = L; l <= N; ++l)
        for(int c = C; c <= M; ++c)
            for(int l1 = 1, l2 = l; l1 <= N; ++l1, ++l2)
                for(int c1 = 1, c2 = c; c1 <= M; ++c1, ++c2)
                {
                    long long Numa = Sum(l1, c1, l2, c2);
                    long long Numb = l * c;

                    if(1LL * Numa * ansb >= 1LL * Numb * ansa)
                    {
                        ansa = Numa;

                        ansb = Numb;
                    }
                }

    long long Ans = 1LL * ansa * 1000;
    Ans /= (1LL * ansb);
    g << Ans / (1LL * 1000) << '.' << Ans % (1LL * 1000) << '\n';

    return 0;
}