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.
#include <map>
#include <set>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <iostream>
#include <stack>
#include <cmath>
#include <string>
#include <vector>
#include <cstdlib>
//#include <bits/stdc++.h>
//#define LOACL
#define space " "
using namespace std;
//typedef long long LL;
//typedef __int64 Int;
typedef pair<int, int> PAI;
const int INF = 0x3f3f3f3f;
const double ESP = 1e-6;
const double PI = acos(-1.0);
const int MOD = 1e9 + 7;
const int MAXN = 60000 + 10;
double v[MAXN], ar[MAXN];
int N;
bool judge(long double t) {
long double r = ar[0] + v[0]*t;
long double l = ar[0] - v[0]*t;
for (int i = 1; i < N; i++) {
long double tr = ar[i] + v[i]*t;
long double tl = ar[i] - v[i]*t;
if (tl <= l && tr >= r) continue;
else if (tl >= l && tr <= r) {l = tl; r = tr;}
else if (tl <= l && l <= tr) {l = l; r = tr;}
else if (l <= tl && r >= tl) {l = tl; r = r;}
else return false;
}
return true;
}
int main() {
while (scanf("%d", &N) != EOF) {
for (int i = 0; i < N; i++) scanf("%d", &ar[i]);
for (int i = 0; i < N; i++) scanf("%d", &v[i]);
double ub = 1e9, lb = 0;
double ans = 0;
while (abs(ub - lb) > ESP) {
long double mid = (lb + ub)/2;
if (judge(mid)) {
ans = mid; ub = mid;
}
else lb = mid;
}
printf("%.7lf\n", ans);
}
return 0;
}