http://codeforces.com/problemset/problem/780/B.
x轴上有n个点,给出这些点的坐标和最大速度,点只能左右移动。
问 所有点到某一点时间最小,求到达该点的时间。
可以对时间进行二分。若时间长为t,则对某一点pos[i],它能到达的范围为pos[i]-time*speed[i],pos[i]+time*speed[i];对n个点所能达到的区域取并集,并且不断缩小时间。
若对时间t,n个点没有并集,则要增大时间,否则减小时间t。
eps取太小会超时。
#include<bits/stdc++.h>
#define maxn 600005
using namespace std;
const double eps=1e-6;
double pos[maxn],speed[maxn];
int n;
bool flag(double time)
{
double left,right,lf,rf;
for(int i=1;i<=n;i++)
{
if(i==1)
{
left=pos[i]-time*speed[i];
right=pos[i]+time*speed[i];
}
else
{
lf=pos[i]-time*speed[i];
rf=pos[i]+time*speed[i];
if(lf>right||rf<left) return 0;
left=max(lf,left);
right=min(right,rf);
}
}
return 1;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>pos[i];
for(int i=1;i<=n;i++) cin>>speed[i];
double l=0,r=1e9;
while(r-l>eps)
{
double mid=(l+r)/2;
if(flag(mid))
r=mid;
else
l=mid;
}
printf("%.12lf\n",r);
return 0;
}