Cod sursa(job #330182)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 9 iulie 2009 03:42:06
Problema Balans Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
# include <stdio.h>

const long int MAXN=300;

long int n,m,p,q,a[MAXN+1][MAXN+1];
long int sume[MAXN+1][MAXN+1];
float sol;

void citire()
{
     FILE *f=fopen("balans.in","r");
     fscanf(f,"%ld%ld%ld%ld",&n,&m,&p,&q);
     long int i,j;
     for (i=1;i<=n;i++)
         for (j=1;j<=n;j++)
             {
             fscanf(f,"%ld",&a[i][j]);
             a[i+n][j]=a[i][j];
             a[i][j+m]=a[i][j];
             a[i+m][j+m]=a[i][j];
             }
     fclose(f);
}

void scrie()
{
     FILE *g=fopen("balans.out","w");
     fprintf(g,"%ld.%ld\n",(long int)sol,((long int)(sol*1000))%1000);
     fclose(g);
}

long int suma(long int i, long int j, long int p, long int q)
{
     return sume[i][j]-sume[i-p][j]-sume[i][j-q]+sume[i-p][j-q];
}

void calculeaza()
{
     long int i,j,pp,qq;
     for (i=1;i<=2*n;i++)
         for (j=1;j<=2*m;j++)
             sume[i][j]=sume[i-1][j]+sume[i][j-1]-sume[i-1][j-1]+a[i][j];
     //determinam suma maxima
     for (pp=p;pp<=n;pp++)
         for (qq=q;qq<=m;qq++)
     for (i=1;i<=n;i++)
         for (j=1;j<=m;j++)
             if ((float)suma(i+p-1,j+q-1,pp,qq)/(pp*qq)>sol) sol=(float)suma(i+p-1,j+q-1,pp,qq)/(pp*qq);
}

int main()
{
    citire();
    calculeaza();
    scrie();
    return 0;
}