关闭

HDU 1007 Quoit Design

589人阅读 评论(0) 收藏 举报
分类:

题目地址:点击打开链接

一道典型的分治法求最小点对的问题,很难搞懂,请参考大神的博客:点击打开链接


以下是代码实现,耗时889ms,已经相当快了,注意如果用cin输入的话会超时。

/*分治法求最小点对*/ 
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>

using namespace std;
struct point {
	double x,y;
}p[100005],*px[100005],*py[100005];

double cmpx(point *a,point *b)
{
	if(a->x==b->x)
	return a->y<b->y;
	
	return a->x<b->x;
}

double cmpy(point *a,point *b)
{
	return a->y<b->y;
}

double dis(point *a,point *b)
{
	return sqrt((a->x-b->x)*(a->x-b->x)+(a->y-b->y)*(a->y-b->y));
}

double min(double a,double b)
{
	return a<b?a:b;
} 

double find(int s,int e)
{
	if(s+1==e)
	return dis(px[s],px[e]);
	if(s+2==e)  
    return min(dis(px[s],px[s+1]),min(dis(px[s+1],px[e]),dis(px[s],px[e])));
    
    int mid=(s+e)>>1;
    double ans=min(find(s,mid),find(mid+1,e));
    int i,j,cnt=0;  
    for(i=s;i<=e;i++)
    {  
        if(px[i]->x>=px[mid]->x-ans&&px[i]->x<=px[mid]->x+ans)  
        py[cnt++]=px[i];  
    }  
    sort(py,py+cnt,cmpy);//按y坐标排序  
    for(i=0;i<cnt;i++)  
    {  
        for(j=i+1;j<cnt;j++) 
        {  
            if(py[j]->y-py[i]->y>=ans)  
            break;  
            ans=min(ans,dis(py[i],py[j]));  
        }  
    }  
    return ans;  
	
}

int main()
{
	long long n,i;
	while(scanf("%d",&n)!=EOF&&n)
	{
		for(i=0;i<n;i++)
		{
			scanf("%lf%lf",&p[i].x,&p[i].y);
			px[i]=&p[i];
		}
		
		sort(px,px+n,cmpx);
		double dis=find(0,n-1)/2;
		
		cout<<fixed<<setprecision(2)<<dis<<endl;
	}
	return 0;
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

HDU 1007 Quoit Design(分治法求最近点对问题)

本题的大致题意,求出最近两个点的距离的一半。 首先先看数据范围,如果暴力的话肯定会超时的,所以要想一个优化点的方法,就是对其进行分治。大致思路:先把一个大区间分为两个小区间,然后分别对两个区间进行排...
  • qq_32866009
  • qq_32866009
  • 2016-04-06 07:25
  • 489

杭电OJ——1007 Quoit Design(最近点对问题)

Quoit Design Problem Description Have you ever played quoit in a playground? Quoit is a game in w...
  • lishuhuakai
  • lishuhuakai
  • 2013-06-24 14:03
  • 7971

hdu 1007 Quoit Design 最近点对(分治)

题意:给定一个整数n,以及n个x
  • a601025382s
  • a601025382s
  • 2014-07-15 19:33
  • 651

【几何】HDU 1007 Quoit Design 最近点对

模板 #include #include #include #include #include #include #include #include using namespace std; #in...
  • u012749539
  • u012749539
  • 2014-08-28 18:25
  • 512

【HDU 1007】Quoit Design(分治法)

【HDU 1007】Quoit Design(分治法) Have you ever played quoit in a playground? Quoit is a game in which fla...
  • Chen_yuazzy
  • Chen_yuazzy
  • 2017-04-27 12:48
  • 204

hdu 1007 Quoit Design 最近点对(分治)

代码#include #include #include #include #define MAXN 100005 //#define min(a,b) (a<b?a:b)//为...
  • define_danmu_primer
  • define_danmu_primer
  • 2016-08-18 14:48
  • 142

HDU 1007 Quoit Design 最小点对基础模板

传送门题目大意是找一个最小的圆覆盖给你一堆点中的两个点,输出改圆的半径基础最近点对模板题#include #include #include #include #include #defin...
  • o670783915
  • o670783915
  • 2016-08-06 10:59
  • 81

hdu 1007 Quoit Design(分治求最近点对)

Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To...
  • u010527492
  • u010527492
  • 2013-12-21 15:46
  • 538

hdu 1007 Quoit Design(借鉴大神,求解平面对点)

Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To...
  • DW_css
  • DW_css
  • 2017-12-02 17:12
  • 32

hdu 1007 Quoit Design(分治法求最近点对)

大致题意:给N个点,求最近点对的距离 d ;输出:r = d/2。 // Time 2093 ms; Memory 1812 K #include #include #include #includ...
  • u010679062
  • u010679062
  • 2013-10-31 15:22
  • 812
    个人资料
    • 访问:53068次
    • 积分:1971
    • 等级:
    • 排名:千里之外
    • 原创:149篇
    • 转载:1篇
    • 译文:0篇
    • 评论:16条
    联系方式
    欢迎谈论交流:1245985209
    友情链接_winter2121
    http://blog.csdn.net/winter2121
    友情链接_anoxiacxy
    https://anoxiacxy.github.io/
    博客专栏