题意 : 在一条横线,n 个人, 每个有对应的速度,可以向两边走。问,这n个人到某点集合的最小时间。
枚据时间 time,则对i人能到的范围为(x[i] + v[i]*time, x[i] - v[i]*time)。然后看所有人能到的范围是否有交集。如果有交集 ,说明他们能在时间t内到某点集合。
#include <bits\stdc++.h>
using namespace std;
int x[70005],v[70005],n;
bool canmeet(double time)
{
double left,right;
for(int i=1;i<=n;i++)
{
if(i==1)
{
right = x[i] + v[i]*time;
left = x[i] - v[i]*time;
}
else
{
double ri = x[i] + time*v[i];
double le = x[i] - time*v[i];
if( le > right || ri < left )
{
return false;
}
left = max(le ,left); // 维持最大的左边 值
right = min(right, ri); // 维持最小的右边 值
}
}
return true;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",x+i);
for(int i=1;i<=n;i++) scanf("%d",v+i);
double l = 0, r = 1e9;
while(r-l>1e-6)
{
double mid = (r+l)/2;
if(canmeet(mid))
{
r = mid;
}
else l = mid;
}
printf("%.7lf\n",r);
return 0;
}