Cod sursa(job #1981432)

Utilizator borcanirobertBorcani Robert borcanirobert Data 15 mai 2017 18:33:25
Problema Trapez Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

ifstream fin("orase2.in");
ofstream fout("orase2.out");

const int MAX = 50005;
const double eps = 0.00001;
const double eps2 = 0.0001;
using LL = long long;
int T, N, X;
int d[MAX];
int v[MAX];

void Read();
void Solve();
double Verif( double b );

double Abs( double a )
{
    if ( a >= 0 )
        return a;
    return -a;
}

int main()
{
    Read();
    Solve();

    fin.close();
    fout.close();
    return 0;
}

void Read()
{
    fin >> T;
    fin >> N >> X;
    for ( int i = 1; i <= N; ++i )
        fin >> d[i];
    for ( int i = 1; i <= N; ++i )
        fin >> v[i];
}

void Solve()
{
    double st = 1/100000., dr = 10000, mij;
    double res;
    while ( dr - st >= eps )
    {
        mij = ( dr + st ) / 2.;
        double r = Verif(mij);

        if ( r != -1 )
        {
            dr = mij - eps;
            res = r;
        }
        else
            st = mij + eps;
    }

    fout << (int)res << '\n';
}

double Verif( double b )
{
    vector<int> vn;
    double tt{0.};
    int r = X;
    for ( int i = 1; i <= N; ++i )
    {
        int st = 1, dr = 10000, mij, t{0};
        double tc = d[i] / (double)v[i];
        while ( st <= dr )
        {
            mij = ( st + dr ) / 2;

            double tnou = d[i] / (double)( v[i] + mij );
            double tp = d[i] / (double)( v[i] + mij - 1 );

            if ( tp - tnou - b > eps )
            {
                t = mij;
                tc = tnou;
                st = mij + 1;
            }
            else
                dr = mij - 1;
        }

        vn.push_back(v[i] + t);
        r -= t;
        tt += tc;

        if ( r < 0 )
            return -1;
    }

    for ( int i = 1; i <= N && r != 0; ++i )
    {
        double tc = d[i] / (double)vn[i - 1];
        double tnou = d[i] / (double)(vn[i - 1] + 1);
        double av = tc - tnou;

        if ( Abs( av - b ) <= eps2 )
        {
            tt -= av;
            --r;
        }
    }

    return tt;
}