using
System;
public
class
Solution
{
static
float
f(
float
mid,
int
N,
int
[] speed,
int
[] dist)
{
float
minDist = 1e9f, maxDist = -1e9f;
for
(
int
i = 0; i < N; i++)
{
float
currDist = dist[i] + mid * speed[i];
minDist = Math.Min(minDist, currDist);
maxDist = Math.Max(maxDist, currDist);
}
return
maxDist - minDist;
}
static
float
GetMinimumDistance(
int
N,
int
K,
int
[] speed,
int
[] dist)
{
float
lo = 0, hi = K;
int
cnt = 300;
while
(cnt != 0)
{
cnt--;
float
mid1 = lo + (hi - lo) / 3.0f;
float
mid2 = hi - (hi - lo) / 3.0f;
float
dist1 = f(mid1, N, speed, dist);
float
dist2 = f(mid2, N, speed, dist);
if
(dist1 == dist2)
{
lo = mid1;
hi = mid2;
}
else
if
(dist1 < dist2)
{
hi = mid2;
}
else
{
lo = mid1;
}
}
return
f(hi, N, speed, dist);
}
public
static
void
Main(
string
[] args)
{
int
N = 3, K = 3;
int
[] speed = { 1, 2, 3 };
int
[] dist = { 1, 2, 3 };
Console.WriteLine(
string
.Format(
"{0:F6}"
, GetMinimumDistance(N, K, speed, dist)));
}
}