HDU 1007Quoit Design(最近点问题)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
最近点问题:二维平面中有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\n", solve(0, n-1)/2.0);
56     }
57     return 0;
58 }
复制代码

 

posted @   hjzqyx  阅读(435)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示