题意:给出n个人的在x轴的位置和最大速度,求n个人相遇的最短时间(相遇位置不一定为整数点) n<=6e4
每个的速度为0~vi 如果在t秒能相遇 在ti<t也可能相遇,二分最小时间,O(n)判断每个人的移动范围是否有交集即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+20;
struct node{
double x,v;
}p[N];
int n;
bool check(double t)
{
double a,b;//移动范围
for(int i=0;i<n;i++)
{
double x=p[i].x-p[i].v*t;
double y=p[i].x+p[i].v*t;
if(i==0)
{
a=x;
b=y;
}
else
{
//移动范围无交集
if(a>y||b<x)
return false;
if(a<=x)
a=x;
if(b>=y)
b=y;
}
}
return true;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
scanf("%lf",&p[i].x);
for(int i=0;i<n;i++)
scanf("%lf",&p[i].v);
double l=0,r=1e9,ans=0;
//精度
while(r-l>1e-7)
{
double mid=(l+r)/2.0;
if(check(mid))
{
ans=mid;
r=mid;//注意:r不能赋为mid-1
}
else
l=mid;
}
printf("%.7lf\n",ans);
return 0;
}