Cod sursa(job #2890890)

Utilizator mateicosCostescu Matei mateicos Data 16 aprilie 2022 22:46:52
Problema Secventa 3 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>

using namespace std;

int v[30005], t[30005];
int n, l, r;

int ok(double med){
    int i, j = 1, s = 0;
    for(i = l;i <= n;i++){
        if(i - j + 1 > r){
            j++;
        }
        while(j <= i && (double)v[j] / (double)t[j] < med)
            j++;
        if(i - j + 1>= l)
            return 1;
    }
    return 0;
}

double bs(double st, double dr){
    double med;
    int i;
    for(i = 0;i < 40;i++){
        med = (st + dr) / 2;
        if(ok(med))
            st = med;
        else
            dr = med;
    }
    return med;
}

int main()
{
    freopen("secv3.in", "r", stdin);
    freopen("secv3.out", "w", stdout);
    int i, j, sv = 0, st = 0;
    double x, s = 0., sol;
    scanf("%d%d%d", &n, &l, &r);
    for(i = 1;i <= n;i++){
        scanf("%d", &v[i]);
    }
    for(i = 1;i <= n;i++){
        scanf("%d", &t[i]);
    }
    x = bs(0.0, 1000.0);
    j = 1;
    for(i = 1;i < l;i++){
        sv += v[i];
        st += t[i];
    }
    for(i = l;i <= n;i++){
        sv += v[i];
        st += t[i];
        if(i - j + 1 > r){
            sv -= v[j];
            st -= t[j];
            j++;
        }
        while(j <= i && (double)v[j] / (double)t[j] < x){
            sv -= v[j];
            st -= t[j];
            j++;
        }
        if(i - j + 1 >= l)
            sol = (double)sv / (double)st;
    }
    printf("%lf", sol);
    return 0;
}