Cod sursa(job #330180)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 9 iulie 2009 03:35:50
Problema Balans Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 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]={0};
long int 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,"%.3f\n",(float)sol/(p*q));
     fclose(g);
}

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

void calculeaza()
{
     long int i,j;
     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
     sol=sume[p][q];
     for (i=1;i<=n;i++)
         for (j=1;j<=m;j++)
             if (suma(i+p-1,j+q-1)>sol) sol=suma(i+p-1,j+q-1);
}

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