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 ", ans); } return 0; }