Cod sursa(job #1724158)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 2 iulie 2016 14:14:22
Problema Balans Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <cstdio>
#define MAXN 150
long long s[2*MAXN][2*MAXN];
inline double max2(double a, double b){
    if(a>b) return a;
    else return b;
}
inline long long sum(int i, int j, int l, int c){
    return s[l][c]-s[i-1][c]-s[l][j-1]+s[i-1][j-1];
}
int main(){
    int nrlin, nrcol, a, b, i, j, l, c;
    double ans=0;
    FILE *fin, *fout;
    fin=fopen("balans.in", "r");
    fout=fopen("balans.out", "w");
    fscanf(fin, "%d%d%d%d", &nrlin, &nrcol, &a, &b);
    for(i=1; i<=nrlin; i++) for(j=1; j<=nrcol; j++) fscanf(fin, "%lld", &s[i][j]);
    for(i=1; i<=nrlin; i++) for(j=1; j<=nrcol; j++) s[i+nrlin][j]=s[i+nrlin][j+nrcol]=s[i][j+nrcol]=s[i][j];
    for(i=1; i<2*nrlin; i++) for(j=1; j<2*nrcol; j++) s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
    for(l=a; l<=nrlin; l++) for(c=b; c<=nrcol; c++)
        for(i=1; i<=nrlin; i++) for(j=1; j<=nrcol; j++)
            ans=max2(ans, sum(i, j, i+l-1, j+c-1)/(double)(l*c));
    fprintf(fout, "%.3lf\n", ans);
    fclose(fin);
    fclose(fout);
    return 0;
}