杭电OJ【1007】Quoit Design 最近点对问题

解题思路:

(其实我用有道翻译了半天也没看懂题是什么鬼=。=)

嘛,其实就是在给的一堆点中,找到最近的一组。然后求出两点之间距离的一半。

分治法没看懂:http://blog.csdn.net/lishuhuakai/article/details/9161843

1.将各点按x排序,求出相邻两点的最短距离。

2.将各点按y排序,求出相邻两点的最短距离。

3.比较x,y得出的最短距离。


代码:【C++代码超时,改成C过了= =||】

#include<cmath>
#include<algorithm>
#define MAX 100000
#include<stdio.h>
#include<stdlib.h>
using namespace std;
struct point
{
    double x,y;
}p[MAX];
int cmpx(point a,point b)
{
    return a.x<b.x;
}
int cmpy(point a,point b)
{
    return a.y<b.y;
}
double length(int i,int j)
{
    double x,y;
    x=(p[i].x-p[j].x)*(p[i].x-p[j].x);
    y=(p[i].y-p[j].y)*(p[i].y-p[j].y);
    return sqrt(x+y);
}
int main()
{
    int t,i;
    double len;
    while(~scanf("%d",&t)&&t)
    {
        len=MAX;
        for(i=0;i<t;i++)scanf("%lf %lf",&p[i].x,&p[i].y);
        sort(p,p+t,cmpx);
        len=length(0,1);
        for(i=1;i<t-1;i++)len=min(len,length(i,i+1));
        sort(p,p+t,cmpy);
        for(i=0;i<t-1;i++)len=min(len,length(i,i+1));
        printf("%.2lf\n",len/2);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值