Pagini recente » Cod sursa (job #510246) | Cod sursa (job #2294835) | Cod sursa (job #416546) | Cod sursa (job #142700) | Cod sursa (job #422861)
Cod sursa(job #422861)
# include <stdio.h>
# include <math.h>
# define MAXN 150
long long int a[2*MAXN+1][2*MAXN+1],sum[2*MAXN+1][2*MAXN+1];
long long int n,m,r,c,elemmaxim;
void citire()
{
FILE *f=fopen("balans.in","r");
fscanf(f,"%lld%lld%lld%lld",&n,&m,&r,&c);
long long int i,j;
long long int aux;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
fscanf(f,"%lld",&aux);
aux*=1000;
if (aux>elemmaxim)
elemmaxim=aux;
a[i][j]=aux;
a[i+n][j]=a[i][j];
a[i][j+m]=a[i][j];
a[i+n][j+m]=a[i][j];
}
fclose(f);
for (i=1;i<=2*n;i++)
for (j=1;j<=2*m;j++)
sum[i][j]=sum[i-1][j]+a[i][j];
}
void scrie(long long int sol)
{
FILE *g=fopen("balans.out","w");
fprintf(g,"%lld.",sol/1000);
fprintf(g,"%lld%lld%lld\n",(sol%1000)/100,((sol%1000)/10)%10,(sol%1000)%10);
fclose(g);
}
long long int sc[2*MAXN+1];
long long int sumsc[2*MAXN+1];
long long int deq[2*MAXN+1];
long long int existsPositiveSubsequence()
{
long long int begin=1,end=0,j;
for (j=c;j<=m*2;j++)
{
//adauga la deq j-c
deq[++end]=j-c;
//scufunda-l in deq
while (end-1>=begin && sumsc[deq[end]]<=sumsc[deq[end-1]])
{
deq[end-1]=deq[end];
end--;
}
//adu capatul deq-ului la curent
while (j-deq[begin]>m)
begin++;
//verifica daca noua suma este pozitiva
if (sumsc[j]-sumsc[deq[begin]] >= 0)
return 1;
}
return 0;
}
long long int canBeObtained(long long int avg)
{
// printf("Now testing average: %.3f\n",(float)avg/1000);
//ne alegem doua linii si calculam sumele pe coloane
long long int lineup, linedown, j;
for (linedown = r; linedown <= n*2; linedown ++)
for (lineup = n < linedown-r? n : linedown-r; lineup >= 0; --lineup)
{
if (lineup<linedown-n) break;
for (j=1;j<=m*2;j++)
{
sc[j]=sum[linedown][j]-sum[lineup][j]-avg*(linedown-lineup);
sumsc[j]=sc[j]+sumsc[j-1];
}
if (existsPositiveSubsequence())
{
// for (j=0;j<=2*m;j++)
// printf("%.3f ",(float)sumsc[j]/1000);
// printf("\n");
// getchar();
return 1;
}
}
return 0;
}
long long int calculeaza(long long int li, long long int lf)
{
long long int m;
while ( lf-li>1 )
{
//printf("%ld %ld\n",li,lf);
m =(li+lf)/2;
//daca m este o medie care se poate obtine, atunci cauta una mai mare
if (canBeObtained(m)) li=m;
else lf=m-1;
}
if (lf>li)
{
if (canBeObtained(lf))
li=lf;
}
return li;
}
int main()
{
citire();
long long int sol = calculeaza(0,elemmaxim);
scrie(sol);
return 0;
}