Pagini recente » Cod sursa (job #573402) | Cod sursa (job #2675291) | Cod sursa (job #566496) | Cod sursa (job #1068562) | Cod sursa (job #1408847)
#include<iostream>
#include<fstream>
using namespace std;
typedef int var;
ifstream fin("balans.in");
ofstream fout("balans.out");
double rez = 1e12;
var n, m, l, c;
#define MAXN 500
double A[MAXN][MAXN], S[MAXN][MAXN], B[MAXN][MAXN];
double V[MAXN], SUM[MAXN];
double sum(var l1, var c1, var l2, var c2) {
return S[l2][c2] - S[l1-1][c2] - S[l2][c1-1] + S[l1-1][c1-1];
}
double solve(double val) {
double M = -1;
for(var i=1; i<=2*n; i++) {
for(var j=1; j<=2*m; j++) {
B[i][j] = A[i][j] - val;
S[i][j] = -S[i-1][j-1] + S[i-1][j] + S[i][j-1] + B[i][j];
}
}
for(var dy = l; dy <= n; dy ++) {
for(var i=dy; i<=2*n; i++) {
for(var j=1; j<=m; j++) {
V[j] = sum(i-dy+1, j, i, j);
V[j+m] = V[j];
}
double s = 0;
for(var j=1; j<=c; j++) {
s += V[j];
}
SUM[c] = s;
for(var j=c+1; j<=2*m; j++) {
SUM[j] = SUM[j-1] + V[j] - V[j-c];
}
M = max(M, SUM[c]);
double best = SUM[c];
for(var j=c+1; j<=2*m; j++) {
best = max(best + V[j], SUM[j]);
M = max(M, best);
}
}
}
return M;
}
int main()
{
fin>>n>>m>>l>>c;
for(var i=1; i<=n; i++) {
for(var j=1; j<=m; j++) {
fin>>A[i][j];
A[i][j+m] = A[i+n][j] = A[i+n][i+m] = A[i][j];
}
}
//solve(0);
double sol = 0;
for(double i=10000; i> 1e-4; i/=2) {
if( solve(sol+i) > 0)
sol += i;
}
fout<<sol;
return 0;
}