zoukankan      html  css  js  c++  java
  • HDU 1007Quoit Design(最近点问题)

    最近点问题:二维平面中有n(n很大)个点,求出距离最近的两个点
    	
    	思路:因为n的值很大,所以暴力和dp都行不通了吧!分治法就挺好的。
    	将区间一半一半的分开,直到分成只有一个点或两个点的时候!
    	对于只有两个点的区间,最小值就是这两个点的距离,只有一个点的区间,
    	最小值就是无穷大。注意还要考虑合并的时候,可能距离最近的两个点,
    	分别在左右两个不同的区间。对于这种情况的处理如下:
    		 mid=(ld+rd)/2;
    		 ans = min(solve(ld, mid), solve(mid+1, rd));得到两段区间最小值的最小值 
    		从中间向两边寻找,因为我们是按照x坐标排序的,在左区间向左边寻找的时候
    		如果某一个点的x到中间点x的距离大于ans(否则将这样的点保存),那么这个
    		点左边的点就不可能在右区间寻找到相应的点满足两个点的距离小于ans的,那么
    		就结束继续查找(这样算是一种优化) 
    		
    		同理在右区间向右寻找。。。
    		
    		然后对存储的节点按照y坐标进行从小到大的排序。 
    		枚举每两个点寻找最小的距离 
    
     1 #include<iostream>
     2 #include<cstring> 
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<algorithm>
     6 #define MAX 99999999999999.0
     7 using namespace std;
     8 
     9 struct node{
    10     double x, y;
    11 }nd[100005], ndx[100005];
    12 
    13 bool cmp(node a, node b){
    14     if(a.x == b.x) return a.y < b.y;
    15     return a.x < b.x;
    16 }
    17 
    18 bool cmpy(node a, node b){
    19     return a.y < b.y; 
    20 }
    21 
    22 double dist(node a, node b){
    23     return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
    24 }
    25 
    26 double solve(int ld, int rd){
    27     if(ld == rd) return MAX;
    28     if(ld + 1 == rd) return dist(nd[ld], nd[rd]);
    29     int mid = (ld+rd)/2;
    30     double ans = min(solve(ld, mid), solve(mid+1, rd));
    31     int len = 0;
    32     for(int i = mid; i>=ld; --i)
    33         if(nd[mid].x - nd[i].x <= ans)
    34             ndx[len++] = nd[i];
    35         else break;
    36     for(int i=mid+1; i<=rd; ++i)
    37         if(nd[i].x - nd[mid].x <= ans)
    38             ndx[len++] = nd[i];
    39         else break;
    40     
    41     sort(ndx, ndx+len, cmpy) ;
    42     for(int i=0; i<len-1; ++i)
    43         for(int j=i+1; j<len; ++j)
    44             if(ndx[j].y - ndx[i].y >= ans) break;//这里做一处优化 
    45             else ans = min(ans, dist(ndx[i], ndx[j]));
    46     return ans;
    47 }
    48 
    49 int main(){
    50     int n; 
    51     while(scanf("%d", &n) && n){
    52         for(int i=0; i<n; ++i)
    53             scanf("%lf%lf", &nd[i].x, &nd[i].y);
    54         sort(nd, nd+n, cmp);
    55         printf("%.2lf
    ", solve(0, n-1)/2.0);
    56     }
    57     return 0;
    58 }
  • 相关阅读:
    iOS 后台定位
    关于烂代码的那些事
    APP上线前,如何做运营推广工作?
    iOS图片折叠效果:Layer的contentsRect属性和渐变层
    iOS中几种数据持久化方案:我要永远地记住你!
    iOS-CoreLocation:无论你在哪里,我都要找到你!
    轻松学习之 IMP指针的作用
    iOS之友盟错误统计解决
    文字渐变效果:图层中的mask属性
    如何坚持每周写一篇博客
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/4348418.html
Copyright © 2011-2022 走看看