hdu 1007最接近點對問題 nlogn複雜度

2021-07-03 22:25:59 字數 879 閱讀 3806

#include #include #include #include using namespace std;

#define inf 100000000

int n;

struct point

else

}};int tmp[100005];

point p[100005];

int cmp(int a,int b)

double dfun(point& a,point& b)

/* 最接近點對問題,的解法是利用分治的思想,

先將所有的點進行排序。

拍完序之後所有的點分為左右兩邊選相等的兩部分s1,s2

因為這時候存在的最接近的點對就在s1和s2中,或者一點在s1乙個點在s2

很明顯當乙個點在s1乙個點在s2中的時候有這兩個點之間的距離到中間點的距離絕對不會超過d= min(s1,s2);

因為如果超過了中間點的距離那麼他們之間的距離必然會大於d

所以現在只需要列舉一下到中間點的距離小於d的點之間的距離就行了

兩邊點已經求出來了最小的距離,這時候在中間點兩邊小於d的點就很少了,所以這時候就能做到優化

*/ double close_pair(int l,int r)else if(l == r - 1)

else

} sort(tmp,tmp+k,cmp);

for(int i = 0;i < k;i++)

}} return d; }}

int main()

sort(p,p+n);

printf("%.2f\n",sqrt(close_pair(0,n-1))/2);

} return 0;

}

hdu1007 最近點對

題意 給你n個點,讓你求最近的兩個點的距離是多少.思路 這個題目我沒思路,我在網上看的是什麼分治 鴿巢原理,分治我知道,鴿巢原理我也知道,但是這個題目就是沒有證明出來他和鴿巢原理有jm關係,總之就是先以x或者y優先sort一下,然後每次列舉每個相鄰點的附近5個就行了 加自己一共六個 而且這個題目的前...

HDU 1007 最近點對

分治法求最近點對 遞迴將點不斷分成小組,計算最短距離。此時的最短距離僅僅是兩點都屬兩塊的某一塊 這裡的分割點是mid點 還需要考慮兩點分屬兩塊的情況。這時對於選點則把範圍縮小到了以mid為中心。再將距離mid點x軸2 mindist範圍點考慮在內。在這些點中,再取mid點,留下那些 y的距離不大於m...

hdu 1007 最近點對

最近點對問題定義 已知上m個點的集合,找出對接近的一對點。在二維空間裡,可用分治法求解最近點對問題。預處理 分別根據點的x軸和y軸座標進行排序,得到x和y,很顯然此時x和y中的點就是s中的點。情況 1 點數小於等於三時 情況 2 點數大於三時 首先劃分集合s為sl和sr,使得sl中的每乙個點位於sr...