Cod sursa(job #788755)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 15 septembrie 2012 19:55:52
Problema Balans Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#include <cstdio>
#include <iomanip>
#define NM 310

using namespace std;

FILE* fin=fopen("balans.in","r");
FILE* fout=fopen("balans.out","w");
const int maxb=8192;
char buf[maxb];
int ptr=0;

inline int GetInt()
{
    int nr=0;
    while(buf[ptr]<'0'||'9'<buf[ptr])
        if (++ptr>=maxb) fread(buf,maxb,1,fin),ptr=0;
    while ('0'<=buf[ptr]&&buf[ptr]<='9')
    {
        nr=nr*10+buf[ptr]-'0';
        if (++ptr>=maxb) fread(buf,maxb,1,fin),ptr=0;
    }
    return nr;
}

int N,M,i,j,R,C,k,l;
int A[NM][NM];
double ANS=0,CANS;

void Read ()
{
    N=GetInt();
    M=GetInt();
    R=GetInt();
    C=GetInt();
    for (i=1; i<=N; i++)
        for (j=1; j<=M; j++)
        {
            A[i][j]=GetInt();
            A[i+N][j]=A[i][j];
            A[i][j+M]=A[i][j];
            A[i+N][j+M]=A[i][j];
        }

    for (i=1; i<=N<<1; i++)
        for (j=1; j<=M<<1; j++)
            A[i][j]+=A[i-1][j]+A[i][j-1]-A[i-1][j-1];

    fclose(fin);
}

void Solve ()
{
    for (k=R; k<=N; k++)
        for (l=C; l<=M; l++)
            for (i=N+1; i<=N<<1; i++)
                for (j=M+1; j<=M<<1; j++)
                {
                    CANS=(A[i][j]-A[i-k][j]-A[i][j-l]+A[i-k][j-l])/(1.0*k*l);
                    ANS=max(ANS,CANS);
                }
}

void Print ()
{
    fprintf(fout,"%.3lf",ANS);
    fclose(fout);
}

int main ()
{
    Read();
    Solve();
    Print();
    return 0;
}