题意:n个人在一条直线上,第I个人在坐标ai处,步行的最大速度为vi(单位m每s),他们能往左或往右走,求出他们能够在一点相遇的最小时间
思路:二分枚举时间t,判断他们所能到达的边界,有交集的不断将区间相交,只要有一个没有交集说明这个时间不能到达同一点。
题目:http://codeforces.com/problemset/problem/780/B
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn = 100000+10;
int a[maxn];
int v[maxn];
int n;
bool check(double t)
{
double left=a[0]*1.0-t*v[0];
double right=a[0]*1.0+t*v[0];
for(int i=1;i<n;i++)
{
double l=a[i]*1.0-t*v[i]*1.0;
double r=a[i]*1.0+t*v[i]*1.0;
if(l>right||r<left)return false;
left=std::max(left,l);
right=std::min(right,r);
}
return true;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
scanf("%d",&v[i]);
double l=0,r=1e9;
while(r-l>1e-6)
{
double mid=(r+l)/2;
if(check(mid))
{
r=mid;
}
else
{
l=mid;
}
}
printf("%.8lf\n",r);
}
}