hdu 1007 Quoit Design(最近点对模板)

       最近点对模板:

  1.  1 #include <iostream>  
     2 #include <algorithm>  
     3 #include <cmath>  
     4 using namespace std;  
     5 const int MAXN = 100005;  
     6 struct POINT  
     7 {  
     8     double x, y;  
     9     int index;  
    10     void input()  
    11     {  
    12         scanf("%lf %lf", &x, &y);  
    13     }  
    14 }X[MAXN], Y[MAXN];  
    15 bool cmpx(const POINT &a, const POINT &b)  
    16 {  
    17     return a.x < b.x;  
    18 }  
    19 bool cmpy(const POINT &a, const POINT &b)  
    20 {  
    21     return a.y < b.y;  
    22 }  
    23 double dis(const POINT &a, const POINT &b)  
    24 {  
    25     return sqrt((a.x-b.x) * (a.x-b.x) + (a.y-b.y) * (a.y-b.y));  
    26 }  
    27 double min_dis(int a, int b, POINT *Y)  
    28 {  
    29     double ans = 1e8;  
    30     if (b-a <= 2)  
    31     {  
    32         for (int i = a; i < b; ++i)  
    33         {  
    34             for (int j = i+1; j <= b; ++j)  
    35             {  
    36                 double temp = dis(X[i], X[j]);  
    37                 if (ans > temp)  
    38                     ans = temp;  
    39             }  
    40         }  
    41         return ans;  
    42     }  
    43     int mid = (a+b) / 2;  
    44     POINT *Yl = new POINT[mid-a+1];  
    45     POINT *Yr = new POINT[b-mid];  
    46     int i, j, k, ind;  
    47     for (i = 0, j = 0, k = 0; i <= b-a; ++i)  
    48     {  
    49         if (Y[i].index <= mid) Yl[j++] = Y[i];  
    50         else Yr[k++] = Y[i];  
    51     }  
    52     double left_min = min_dis(a, mid, Yl);  
    53     double right_min = min_dis(mid+1, b, Yr);  
    54     ans = min(left_min, right_min);  
    55     double line = X[mid].x;  
    56     for (i = 0, ind = 0; i <= b-a; ++i)  
    57     {  
    58         if (fabs(Y[i].x - line) < ans)  
    59             Y[ind++] = Y[i];  
    60     }  
    61     for (i = 0; i < ind - 1; ++i)  
    62     {  
    63         for (j = i+1; j <= i+7 && j < ind; ++j)  
    64         {  
    65             double temp = dis(Y[i], Y[j]);  
    66             if (ans > temp)  
    67                 ans = temp;  
    68         }  
    69     }  
    70     delete []Yl;  
    71     delete []Yr;  
    72     return ans;  
    73 }  
    74 int main()  
    75 {  
    76     int n, i;  
    77     while (scanf("%d", &n), n)  
    78     {  
    79         for (i = 0; i < n; ++i)  
    80             X[i].input();  
    81         sort(X, X+n, cmpx);  
    82         for (i = 0; i < n; ++i)  
    83             X[i].index = i;  
    84         memcpy(Y, X, n * sizeof(POINT));  
    85         sort(Y, Y+n, cmpy);  
    86         printf("%.2lf\n", min_dis(0, n-1, Y) / 2);                   
    87     }  
    88     return 0;  
    89 }  

    最后输出半径,要除以2.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PegasusWang_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值