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
下面对三分做一下介绍:举个具体的例子,3分 查找一个区间内[a,b]函数f(x)的最小值,假设函数是先减后增的大致的流程是,开始l=a,h=b;令 m1=l+(h-l)/3 ,m2=l+2*(h-l)/3 ,即3
等分(l,h) (这个可以随意不必要等分)如果f(m1)<f(m2)的话,证明m2一定在最小值的右边(否则在(m1,m2)区间的单调递减的),这样就可以令h=m2,新的(l,h)同样包含最小
值点,同理f(m1)>=f(m2) 证明m1一定在最小值的左边 (否则在(m1,m2)区间的单调递增的),,这样就可以令l=m1, 新的(l,h)同样包含最小值点得到新的(l,h)之后重复上述步
骤,直到l与h相差很小。很显然这道题也是一样,只有在最好的位置才会是最小的,只要远离最优点,不管是向左远离还是向右远离都是变大,所以,这里就用到了三分。
下面是代码:
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 60000+10;
const double ips = 1e-6;
int n;
double maxx=0,minx=inf;
struct Node
{
double x,v;
} node[maxn];
double fun1(double x)
{
int i;
double maxt=0;
for(i=1; i<=n; i++)
maxt=max(maxt,fabs(node[i].x-x)/node[i].v);
return maxt;
}
double fun2()
{
double l=minx,r=maxx,mid,midd;
while(r-l>=ips)
{
mid=l+(r-l)/3,midd=r-(r-l)/3;
if(fun1(mid)>fun1(midd))
l=mid;
else
r=midd;
}
return fun1((l+r)/2);
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%lf",&node[i].x);
maxx=max(maxx,node[i].x);
minx=min(minx,node[i].x);
}
for(int i=1; i<=n; i++)
scanf("%lf",&node[i].v);
printf("%.10lf\n",fun2());
return 0;
}