經典問題,平面最近點對,使用分治來解決
把所有點按橫座標排序,分治求解距離
合併時將兩邊的最近點對距離也比較一下
屬於不同集合的點比較距離時判斷一下即可
#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
const int maxn = 200010;
const double inf = 2 << 28;
int t, n, tot;
struct pointp[maxn], tmp[maxn];
bool cmp(point a, point b)
double calc(point a, point b)
double merge(int l, int r)
if(l + 1 == r)
int mid = (l + r) >> 1;
double d1 = merge(l, mid);
double d2 = merge(mid + 1, r);
dis = min(d1, d2);
int cnt = 0;
for(int i=l; i <= r; ++i) }
sort(tmp + 1, tmp + 1 + cnt, cmp);
for(int i = 1;i <= cnt; ++i)
} return dis;
}ll read() while(ch>='0' && ch<='9') return s*f; }
int main()
sort(p + 1, p + 1 + tot, cmp);
printf("%.4lf\n",merge(1,tot));
return 0;
}
AcWing 119襲擊 平面點間對問題
思路 把所有點按橫座標排序 開始分治 l,r 遞迴到 l,r 上只有乙個點,或者有倆個點 找到中間點的橫座標,找到遞迴時最小間間距res 找到橫座標屬於min x res 到 min x res 的點 放到temp陣列中 將temp陣列按找y值排序 用暴力找到既屬於以邊長為res的正方形內 的倆個點...
119 襲擊(平面最近點對)
我們先求出只有一種點找兩個距離最近的點的方法,然後再延伸到找兩種點中的最近距離。假如只有一種點,我們先按照x來排序,且左半部分為 left mid 右半部分為 mid 1 r 我們先求出左半部分 left mid 點的最小值,再求出右邊部分點的最小值 mid 1 right 再合併求兩部分的最小值。...
題解 襲擊(平面最近點對)
題目描述 在與聯盟的戰鬥中屢戰屢敗後,帝國撤退到了最後乙個據點。依靠其強大的防禦系統,帝國擊退了聯盟的六波猛烈進攻。經過幾天的苦思冥想,聯盟將軍亞瑟終於注意到帝國防禦系統唯一的弱點就是能源 該系統由n個核電站 能源,其中任何乙個被摧毀都會使防禦系統失效。將軍派出了n個 進入據點之中,打算對能源站展開...