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
1 #include<cstdio> 2 struct type{ 3 int x; 4 int v; 5 }p[60000+5]; 6 int n; 7 bool check(double time) 8 { 9 //遍历每个人在time个单位时间后能走到的位置,不断更新重叠的区间[l,r],只要到最后这个区间一人不为空,就return true 10 double l=p[1].x-time*p[1].v; 11 double r=p[1].x+time*p[1].v; 12 for(int i=2;i<=n;i++){ 13 if(p[i].x-time*p[i].v > l) l=p[i].x-time*p[i].v; 14 if(p[i].x+time*p[i].v < r) r=p[i].x+time*p[i].v; 15 if(l>r) return false; 16 } 17 return true; 18 } 19 int main() 20 { 21 scanf("%d",&n); 22 for(int i=1;i<=n;i++) scanf("%d",&p[i].x); 23 for(int i=1;i<=n;i++) scanf("%d",&p[i].v); 24 double st=0,ed=1000000000; 25 while(ed-st>1e-7){ 26 double mid=st+(ed-st)/2; 27 if(check(mid)) ed=mid; 28 else st=mid; 29 } 30 printf("%.12lf ",ed); 31 }