Pagini recente » Cod sursa (job #8282) | Cod sursa (job #2199637) | Cod sursa (job #3271799) | Cod sursa (job #1813068) | Cod sursa (job #1572100)
#include<cstdio>
using namespace std;
const int nMax = 153;
int mat[nMax * 2][nMax * 2], dq[nMax * 2];
long long sumPart[nMax * 2];
int n, m, r, q, st, dr;
bool verif(int x){
int i, j, p, k, s;
for(i = 1 ; i <= 2 * n ; ++i){
for(j = 1 ; j <= 2 * m ; ++j){
sumPart[j] = 0;
}
for(j = i ; j <= 2 * n && j < i + n ; ++j){
for(p = 1, s = 0; p <= 2 * m ; ++p){
s += (mat[j][p] - x);
sumPart[p] += s;
}
if(j >= i + r - 1){
st = 1; dr = 0;
for(p = q, k = 0; p <= 2 * m ; ++p, ++k){
while(st <= dr && sumPart[dq[dr]] >= sumPart[k])
--dr;
dq[++dr] = k;
if(st <= dr && dq[st] < p - m)
++st;
if(sumPart[p] - sumPart[dq[st]] >= 0)
return 1;
}
}
}
}
return 0;
}
int main (){
FILE *in = fopen("balans.in","r");
FILE *out = fopen("balans.out","w");
fscanf(in,"%d%d%d%d", &n, &m, &r, &q);
int i, j;
for(i = 1 ; i <= n ; ++i){
for(j = 1 ; j <= m ; ++j){
fscanf(in,"%d", &mat[i][j]);
mat[i][j] *= 1000;
mat[i + n][j] = mat[i][j];
mat[i][j + m] = mat[i][j];
mat[i + n][j + m] = mat[i][j];
}
}
if(!r) r = 1;
if(!q) q = 1;
int pas, rez = 0;
for (pas = 0; verif((1 << pas)); ++pas);
-- pas;
for( ; pas >= 0; pas --){
if(verif(rez + (1 << pas)))
rez += (1 << pas);
}
fprintf(out,"%.3lf\n", (double)rez / 1000);
return 0;
}