The Meeting Place Cannot Be Changed
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.
Input
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.
Output
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.
Example
Input
3
7 1 3
1 2 1
Output
2.000000000000
Input
4
5 10 3 2
2 3 2 4
Output
1.400000000000
题目大意
一条坐标轴上有n个点,每个点的移动速度都是不相同的,现在要求求出所有点集中到某一点的最短时间
思路
某点移动到最终点花费的最长时间决定着整个移动的最短时间,要使花费的时间最少,那么该点左边和右边的花费时间最长的两个点到该点所花费的时间要尽可能相等
对选点的位置进行二分查找,若该点左边花费时间最长的点时间大于右边,那么我们应该把最终的集中点往左边移动使得两边的时间尽可能相等
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAX_N = 600005;
double pos[MAX_N];
double speed[MAX_N];
int n;
int main() {
double mi=0xfffffffff,mx=-1,mid;
cin >> n;
for(int i =1; i <= n; i++) {
cin >> pos[i];
mx = max(mx,pos[i]);
mi = min(mi,pos[i]);
}
for(int i =1; i <= n; i++) {
cin >> speed[i];
}
double shang = 0,xia = 0;
while(fabs(mi-mx) >= 0.000001) {
mid = (mi+mx)/2;
shang = 0;
xia = 0;
for(int i = 1; i <= n; i++) {
if(pos[i] > mid) {
shang = max(shang,(pos[i]-mid)/speed[i]);
}
if(pos[i] < mid) {
xia = max(xia,(mid-pos[i])/speed[i]);
}
}
if(shang > xia) {
mi = mid;
}
if(shang == xia) {
break;
}
if(shang < xia) {
mx = mid;
}
}
printf("%.12f\n",(shang+xia)/2);
return 0;
}