给出了很多点和速度,问所有点相聚在一起的最短时间是多少
每个点在时间范围内,其对应的速度会形成一个范围,那么如果所有点的范围都存在交集时,这种情况就可能正确,但如果有的点的范围和其他点的最小的范围没有交集的话,时间就要再增大一点,所以利用这个特性来进行二分,寻找答案。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N=6e6+5;
int pos[N];
int sp[N],n;
double eps=1e-7;
int fun(double x)
{
double l=pos[1]+sp[1]*x;
double r=pos[1]-sp[1]*x;
for(int i=2;i<=n;i++)
{
double tmpl=pos[i]+sp[i]*x;
double tmpr=pos[i]-sp[i]*x;
if(tmpr>l||tmpl<r)
return 0;
else
{
l=min(l,tmpl);
r=max(r,tmpr);
}
}
return 1;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&pos[i]);
for(int i=1;i<=n;i++)
scanf("%d",&sp[i]);
double l=0;
double r=1e9+5;
while(l+eps<r)
{
double mid=(l+r)/2;
if(fun(mid))
r=mid;
else
l=mid;
}
printf("%lf\n",l);
}
return 0;
}
The main road in Bytecity is a straight line from south to north. Conveniently, there are coordinates measured in meters from the southernmost building in north direction.
At some points on the road there are n friends, and i-th of them is standing at the point xi meters and can move with any speed no greater than vi meters per second in any of the two directions along the road: south or north.
You are to compute the minimum time needed to gather all the n friends at some point on the road. Note that the point they meet at doesn't need to have integer coordinate.
The first line contains single integer n (2 ≤ n ≤ 60 000) — the number of friends.
The second line contains n integers x1, x2, ..., xn (1 ≤ xi ≤ 109) — the current coordinates of the friends, in meters.
The third line contains n integers v1, v2, ..., vn (1 ≤ vi ≤ 109) — the maximum speeds of the friends, in meters per second.
Print the minimum time (in seconds) needed for all the n friends to meet at some point on the road.
Your answer will be considered correct, if its absolute or relative error isn't greater than 10 - 6. Formally, let your answer be a, while jury's answer be b. Your answer will be considered correct if holds.
3 7 1 3 1 2 1
2.000000000000
4 5 10 3 2 2 3 2 4
1.400000000000