The Meeting Place Cannot Be Changed

本文介绍了一种计算多个不同速度的个体聚集在同一地点所需的最短时间的方法。通过二分查找来确定最佳会合点,确保从各位置到达该点的时间尽可能接近,从而实现最短的总等待时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值