• hdu 1007 N个点中输出2点的最小距离的一半


    分治法

    Sample Input
    2
    0 0
    1 1
    2
    1 1
    1 1
    3
    -1.5 0
    0 0
    0 1.5
    0

    Sample Output
    0.71
    0.00
    0.75

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <cstring>
     4 # include <algorithm>
     5 # include <string>
     6 # include <cmath>
     7 # include <queue>
     8 # include <list>
     9 # define LL long long
    10 using namespace std ;
    11 
    12 const double eps = 1e-6;
    13 const int MAXN = 100010;
    14 const double INF = 1e20;
    15 struct Point
    16 {
    17    double x,y;
    18 };
    19 
    20 double dist(Point a,Point b)
    21 {
    22    return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
    23 }
    24 
    25 Point p[MAXN];
    26 Point tmpt[MAXN];
    27 bool cmpxy(Point a,Point b)
    28 {
    29     if(a.x != b.x)return a.x < b.x;
    30     else return a.y < b.y;
    31 }
    32 bool cmpy(Point a,Point b)
    33 {
    34     return a.y < b.y;
    35 }
    36 double Closest_Pair(int left,int right)
    37 {
    38     double d = INF;
    39     if(left == right)return d;
    40     if(left + 1 == right)
    41     return dist(p[left],p[right]);
    42     int mid = (left+right)/2;
    43     double d1 = Closest_Pair(left,mid);
    44     double d2 = Closest_Pair(mid+1,right);
    45     d = min(d1,d2);
    46     int k = 0;
    47     for(int i = left;i <= right;i++)
    48     {
    49         if(fabs(p[mid].x - p[i].x) <= d)
    50         tmpt[k++] = p[i];
    51     }
    52     sort(tmpt,tmpt+k,cmpy);
    53     for(int i = 0;i <k;i++)
    54     {
    55         for(int j = i+1;j < k && tmpt[j].y - tmpt[i].y < d;j++)
    56         {
    57             d = min(d,dist(tmpt[i],tmpt[j]));
    58         }
    59     }
    60     return d;
    61 }
    62 
    63 int main()
    64 {
    65     //freopen("in.txt","r",stdin) ;
    66     int n;
    67     while(scanf("%d",&n)==1 && n)
    68     {
    69         for(int i = 0;i < n;i++)
    70         scanf("%lf%lf",&p[i].x,&p[i].y);
    71         sort(p,p+n,cmpxy);
    72         printf("%.2lf
    ",Closest_Pair(0,n-1)/2);
    73     }
    74     return 0;
    75 }
    View Code
  • 相关阅读:
    学期总结
    第一次博客作业
    C语言博客作业08
    C语言博客作业07
    C语言博客作业06
    C语言博客作业05
    c语言l博客作业04
    C语言II博客作业04
    C语言II博客作业03
    C语言II博客作业02
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/4869836.html
Copyright © 2020-2023  润新知