凹凸曼和小怪兽的故事

Description

世界末日来了,凹凸曼和小怪兽们开始进行最后一次较量!这次决战总共有n个凹凸曼和n个小怪兽,位置以坐标形式给出。因为是最后一次战斗,所以无论是哪一边都想要赢得第一场角逐,于是双方都想要找出最近的那一对凹凸曼和小怪兽,凹凸曼和小怪兽的速度分别为a和b(单位长度每秒)。不过,凹凸曼和小怪兽的智商相信有童年的童鞋们都明白,写个程序帮他们算算最早的角逐需要多长时间开始吧,凹凸曼和小怪兽遇到了就会开始角逐,而且它们会相向而行。

Input

第一行给出n,a,b三个整数(0<n<100000);

接下来的n行给出凹凸曼位置,每行两个整数x,y(0≤x,y≤1000000000);

再接下来的n行给出小怪兽位置,每行两个整数x,y(0≤x,y≤1000000000);

Output

对于每一组数据输出最短开始角逐的时间 

Sample Input

4 1 2
0 0
0 1
1 0
1 1
2 2
2 3
3 2
3 3
4 100 1
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0

Sample Output

0.471
0.000
/*用二分的方法做,先将X从小到大排序,然后二分找出之间最小距离,这是算出了X最近的距离,
比如这之间的点的最小距离是ans,然后我们只要把 x>=mid-ans && x<=mid+ans中的点放进另外一个
数组中再以Y从小到大的排序再找一次之间最小距离。这样就可以找出全部点中的最小距离。*/

#include <stdio.h>
#include <algorithm>
#include <math.h>
#define MAXN 100005
using namespace std;

struct node
{
    double x,y;
    bool operator<(node a) const
    {
        return x<a.x;
    }
} A[MAXN],B[MAXN];
//二分算出x的最小距离
int search(int n,double key)
{
    int l=1,r=n+1,mid;
    while (r-l>1)
    {
        mid=l+r>>1;
        if (B[mid].x<key) l=mid;
        else  r=mid;
    }
    return l;
}

int main()
{
    int n,i,t1,t2,v1,v2;
    while (~scanf("%d%d%d",&n,&v1,&v2))
    {
        for (i=1; i<=n; i++) scanf("%lf%lf",&A[i].x,&A[i].y);
        for (i=1; i<=n; i++) scanf("%lf%lf",&B[i].x,&B[i].y);
        sort(A+1,A+1+n);
        sort(B+1,B+1+n);
        double ans=1e30;
        for (t1=1; t1<=n; t1++)
            for (t2=search(n,A[t1].x-ans); t2<=n && B[t2].x-A[t1].x<ans; t2++)
                ans=min(ans,sqrt((A[t1].x-B[t2].x)*(A[t1].x-B[t2].x)+(A[t1].y-B[t2].y)*(A[t1].y-B[t2].y)));//A B之间的距离
        printf("%.3lf\n",ans/(v1+v2));
    }
    return 0;
}

 

posted @ 2013-09-05 09:45  1002liu  阅读(1208)  评论(0编辑  收藏  举报