這題主要就是幾何問題中的分治
將集合劃分為s1和s2,根據平衡子問題原則,每個子集中大約有n/2個點,設集合s的最近點對為p1和p2;
1.最近點對在集合s1中;
2.最近點對在集合s2中;
3.最近點對在集合s1和s2中;
對於情況1和2比較簡單直接遞迴求解;但第三種情況稍微麻煩一些,在1,2的基礎上求中間兩邊的點距離在1和2中的dmini值內可能存在的情況點,在那這些點進行計算和之進行比較,從而求得結果;
#include #include #include using namespace std;
struct point
;point s[100005];
bool cmpx(point a,point b) //排序
bool cmpy(point a,point b) //排序
double ddistance(point a,point b) //計算兩點之間的距離
double closest(int low,int high)
if(high-low==2) //只有三個點,直接求
else}}
return d;
}int main()
sort(s,s+n,cmpx);
dd=closest(0,n-1)/2;
printf("%.2lf\n",dd);
}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...