Cod sursa(job #2369572)

Utilizator BogdanRazvanBogdan Razvan BogdanRazvan Data 6 martie 2019 01:10:27
Problema Secventa 3 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>

using namespace std;
ifstream fin ("secv3.in");
ofstream fout ("secv3.out");
int c[30005], t[30005], d[30005];
int main()
{
    int n, mn, mx, sum1 = 0, sum2 = 0;
    double ans = 0;
    fin >> n >> mn >> mx;
    for(int i = 1; i <= n; ++i) fin >> c[i];
    for(int i = 1; i <= n; ++i) fin >> t[i];
    int F = 1, L = 0;
    for(int i = 1; i <= mn; ++i) d[++L] = i, sum1 += c[d[L]], sum2 += t[d[L]];
    ans = max(ans, 1.0 * sum1 / sum2);
    for(int i = mn + 1; i <= n; ++i) {
        if(L - F + 1 == mx) {
            while(1.0 * (sum1 - c[d[F]]) / (sum2 - t[d[F]]) >= 1.0 * sum1 / sum2 && L - F + 1 > mn) {
                    sum1 -= c[d[F]], sum2 -= t[d[F]], ++F;
                    ans = max(ans, 1.0 * sum1 / sum2);
            }
                if(L - F + 1 == mx) d[++L] = i, sum1 += c[d[L]] - c[d[F]], sum2 += t[d[L]] - t[d[F]], ++F;
                else d[++L] = i, sum1 += c[d[L]], sum2 += t[d[L]];
        }
        else {
            while(1.0 * (sum1 - c[d[F]]) / (sum2 - t[d[F]]) >= 1.0 * sum1 / sum2 && L - F + 1 > mn) {
                    sum1 -= c[d[F]], sum2 -= t[d[F]], ++F;
                    ans = max(ans, 1.0 * sum1 / sum2);
            }
            d[++L] = i, sum1 += c[d[L]], sum2 += t[d[L]];
        }
        ans = max(ans, 1.0 * sum1 / sum2);
    }
    while(L - F + 1 > mn) {
        sum1 -= c[d[F]], sum2 -= t[d[F]], ++F;
        ans = max(ans, 1.0 * sum1 / sum2);
    }
    fout << ans;
    return 0;
}