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;
}