D - 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.

Examples
Input
3
7 1 3
1 2 1
Output
2.000000000000
Input
4
5 10 3 2
2 3 2 4
Output
1.400000000000
Note

In the first sample, all friends can gather at the point 5 within 2 seconds. In order to achieve this, the first friend should go south all the time at his maximum speed, while the second and the third friends should go north at their maximum speeds.


第一次写博客,先挑一个一遍AC的题目试一下水。惭愧。
题目大概意思是给出若干个地点和速度,从两头往中间跑,若能够全部相遇那么就说明成功,在所有成功的情况下找到所花费的最短时间。

题目不难,这道题的思想显而易见在于二分。在刚拿到题的时候想了一下要不要排序,一开始觉得排序之后对位置进行二分,然后计算时间。尝试了一下发现有点复杂,就没做下去。后来据说这样的做法会因为sort排序超时,也说明不是最优算法。之后发现了可以直接对时间进行二分,用来check的子函数则判断在当前时间下所有数向左跑的最右距离A和所有数向右跑的最左距离B,判断条件则是若A<=B,则时间符合,那么将时间范围向大的方向二分,相反就往小的方向二分。

在做二分的题目时,经常会因为超时而TL,这道题侥幸一次AC了,选择了正确的判断条件。还是要通过多A题来提高对条件的敏感度。下面贴上代码仅供参考。
#include <iostream>
#include <math.h>
#include <iomanip>
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
int N,K;
struct node
{
    long long x;
    long long y;
}X[100001];
double ku(double t)
{
    int i;
    double r,l,s;
    r=X[1].x+t*X[1].y;
    l=X[1].x-t*X[1].y;
    for(i=2;i<=N;i++)
    {
        s=X[i].x+t*X[i].y;
        if(s<r)
            r=s;
    }
    for(i=2;i<=N;i++)
    {
        s=X[i].x-t*X[i].y;
        if(s>l)
            l=s;
    }
    if(r>=l)
    return 1;
    else
        return 0;
}
int main()
{
    int i,mi,ma,j,sa,k,cool;
    double start,mid,end,t=1000;
    scanf("%d",&N);
    for(i=1;i<=N;i++)
        cin >> X[i].x;
    for(i=1;i<=N;i++)
        cin >> X[i].y;
    mi=ma=X[1].x;
    for(i=1;i<=N;i++)
    {
        if(X[i].x>ma)
            ma=X[i].x;
        if(X[i].x<mi)
            mi=X[i].x;
    }
    start=0;
    end=(ma-mi)/2.0;
    for(;t>=0;)
    {
        t--;
        mid=(start+end)/2;
        if(ku(mid)==1)
            end=mid;
                else
                    start=mid;
    }
    printf("%.12f\n",mid);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值