二分时间 t,
把每个 t 的所有位移量求出来, 找出向左的最大值,和向右的最小值。
如果有交集,m再小
没交集,m再大,
逼近结果就是t的最小值
#include<bits/stdc++.h>
using namespace std;
const int maxn = 60010;
const double eps = 1e-6;
int n;
double v[maxn],x[maxn];
double ans;
int judge(double t){
double ml=-1.0,mr=1e9+10.0;
for(int i=0;i<n;++i){
mr=min(mr,x[i]+v[i]*t);
ml=max(ml,x[i]-v[i]*t);
if(ml>mr) return 0;
}
return 1;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;++i) scanf("%lf",&x[i]);
for(int i=0;i<n;++i) scanf("%lf",&v[i]);
double l=0,r=1e9+10;
while(r-l>-eps){
double m=(l+r)/2;
if(!judge(m)){
l=m+eps;
}
else{
ans=m;
r=m-eps;
}
}
printf("%.12lf\n",ans);
return 0;
}