Pagini recente » Cod sursa (job #1191810) | Borderou de evaluare (job #156974) | Cod sursa (job #3133410) | Cod sursa (job #263101) | Cod sursa (job #2607322)
#include <stdio.h>
#define NMAX 30003
#define EPS 0.001
#define MAXVAL 33554432
using namespace std;
int vcost[NMAX], vtimp[NMAX];
int main() {
freopen ( "secv3.in", "r", stdin );
freopen ( "secv3.out", "w", stdout );
int n, lmin, lmax, i, scost, stimp, f;
float dr, st, mij, mij1, mij2, miju, r;
scanf ( "%d%d%d", &n, &lmin, &lmax );
for ( i = 0; i < n; i ++ )
scanf ( "%d", &vcost[i] );
for ( i = 0; i < n; i ++ )
scanf ( "%d", &vtimp[i] );
st = 0;
dr = MAXVAL;
while ( dr - st > EPS ) {
mij = (float) ( dr + st ) / 2;
scost = stimp = 0;
for ( i = 0; i < lmin; i ++ ) {
scost += vcost[i];
stimp += vtimp[i];
}
if ( (float) scost / stimp < mij )
f = 0;
else
f = 1;
for ( i = lmin; i < n; i ++ ){
scost = scost - vcost[i - lmin] + vcost[i];
stimp = stimp - vtimp[i - lmin] + vtimp[i];
if ( (float) scost / stimp > mij )
f = 1;
}
if ( f == 0 )
dr = mij;
else
st = mij;
}
mij1 = mij2 = miju = mij;
if ( lmin != lmax ) {
st = 0;
dr = MAXVAL;
while ( dr - st > EPS ) {
mij1 = (float) ( dr + st ) / 2;
scost = stimp = 0;
for ( i = 0; i < lmin + 1; i ++ ) {
scost += vcost[i];
stimp += vtimp[i];
}
if ( (float) scost / stimp < mij1 )
f = 0;
else
f = 1;
for ( i = lmin + 1; i < n; i ++ ){
scost = scost - vcost[i - lmin - 1] + vcost[i];
stimp = stimp - vtimp[i - lmin - 1] + vtimp[i];
if ( (float) scost / stimp > mij1 )
f = 1;
}
if ( f == 0 )
dr = mij1;
else
st = mij1;
}
}
if ( lmin + 1 < lmax ) {
st = 0;
dr = MAXVAL;
while ( dr - st > EPS ) {
mij2 = (float) ( dr + st ) / 2;
scost = stimp = 0;
for ( i = 0; i < lmin + 2; i ++ ) {
scost += vcost[i];
stimp += vtimp[i];
}
if ( (float) scost / stimp < mij2 )
f = 0;
else
f = 1;
for ( i = lmin + 2; i < n; i ++ ){
scost = scost - vcost[i - lmin - 2] + vcost[i];
stimp = stimp - vtimp[i - lmin - 2] + vtimp[i];
if ( (float) scost / stimp > mij2 )
f = 1;
}
if ( f == 0 )
dr = mij2;
else
st = mij2;
}
}
st = 0;
dr = MAXVAL;
while ( dr - st > EPS ) {
miju = (float) ( dr + st ) / 2;
scost = stimp = 0;
for ( i = 0; i < lmax; i ++ ) {
scost += vcost[i];
stimp += vtimp[i];
}
if ( (float) scost / stimp < miju )
f = 0;
else
f = 1;
for ( i = lmax; i < n; i ++ ){
scost = scost - vcost[i - lmax] + vcost[i];
stimp = stimp - vtimp[i - lmax] + vtimp[i];
if ( (float) scost / stimp > miju )
f = 1;
}
if ( f == 0 )
dr = miju;
else
st = miju;
}
if ( mij >= mij1 && mij >= mij2 && mij >= miju )
r = mij;
else if ( mij1 >= mij && mij1 >= mij2 && mij1 >= miju )
r = mij1;
else if ( mij2 >= mij && mij2 >= mij1 && mij1 >= miju )
r = mij2;
else
r = miju;
printf ( "%f\n", r );
return 0;
}