Pagini recente » Cod sursa (job #1920121) | Cod sursa (job #1593048) | Cod sursa (job #1490367) | Cod sursa (job #2162968) | Cod sursa (job #1981432)
#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;
}