解題思路
算最近點對距離的一半即可。
參考**
#include
using
namespace std;
#define local
//提交的時候一定注釋
#define _for(i, a, b) for(int i = (a); i < (b); ++i)
#define _rep(i, a, b) for(int i = (a); i <= (b); ++i)
#define pb push_back
#define vi vector
#define inf 1e20
#define mp make_pair
#define lowbit(x) ((x) & (-x))
typedef
long
long ll;
typedef
double db;
const db eps =
1e-8
;//定義浮點數誤差
const
int mod =
998244353
;const
int maxn =
100010
;int
readint()
//計算幾何
intsgn
(db x)
struct point
point operator
+(point b);}
point operator
-(point b);}
point operator
/(db k);}
point operator
*(db k);}
bool
operator
==(point b)};
db cross
(point a, point b)
//求×積
db distance
(point a, point b)
db polygon_area
(point *p,
int n)
return area/2;
//是按照三角形來算,所以這裡統一除2
}point polygon_center
(point *p,
int n)
return ans/area/6;
}//判斷兩線段相交
bool
cross_segment
(point a, point b, point c, point d)
bool
cmpxy
(point a, point b)
bool
cmpy
(point a, point b)
point p[maxn]
, tmp_p[maxn]
;//尋找最近點對
db closest_pair
(int left,
int right)
sort
(tmp_p, tmp_p + k, cmpy)
;_for
(i,0
, k)
}return dis;
}int
main()
sort
(p, p + n, cmpxy)
;printf
("%.2f\n"
,closest_pair(0
, n -1)
/2);
}return0;
}
解題思路
設點的個數 n
nn, 先計算出一開始的最近點對距離 d
dd ,儲存他們的位置。
再計算分別去掉這兩個點之後的最近點對距離 d1,
d2
d_1,d_2
d1,d2
。最後的結果即為 d×(
n−2)
+d1+
d2
d\times(n-2)+d_1+d_2
d×(n−2
)+d1
+d2
。注意事項
1.開 lon
glon
glong\ long
longlo
ng。2.分治法求解的時候利用好 opt
optop
t 標記。
參考**
#include
using
namespace std;
#define local
//提交的時候一定注釋
#define _for(i, a, b) for(int i = (a); i < (b); ++i)
#define _rep(i, a, b) for(int i = (a); i <= (b); ++i)
#define pb push_back
#define vi vector
#define mp make_pair
#define lowbit(x) ((x) & (-x))
typedef
long
long ll;
typedef
double db;
const db eps =
1e-8
;//定義浮點數誤差
const
int mod =
998244353
;const
int maxn =
1e5+10;
const ll inf =
1e18
;int
readint()
//計算幾何
intsgn
(db x)
struct point
point operator
+(point b);}
point operator
-(point b);}
point operator
/(ll k);}
point operator
*(ll k);}
bool
operator
==(point b)};
ll distance
(point a, point b)
bool
cmpxy
(point a, point b)
bool
cmpy
(point a, point b)
point p[maxn]
, tmp_p[maxn]
;int pos[3]
;//尋找最近點對
ll ans = inf;
//開的是全域性變數
void
closest_pair
(int left,
int right,
int opt)}}
return;}
int mid =
(left + right)/2
;closest_pair
(left, mid, opt)
;closest_pair
(mid +
1, right, opt)
;int k =0;
_rep
(i, left, right)
sort
(tmp_p, tmp_p + k, cmpy)
;_for
(i,0
, k)}}
}}intmain()
sort
(p, p + n, cmpxy)
; point tmp;
ll sum =0;
ans = inf;
closest_pair(0
, n -1,
-1);
sum +
=(n -2)
* ans;
ans = inf;
closest_pair(0
, n -
1, pos[0]
);sum +
= ans;
ans = inf;
closest_pair(0
, n -
1, pos[1]
);sum +
= ans;
printf
("%lld\n"
, sum);}
return0;
}
演算法競賽從入門到高階 二維幾何 平面最近點對
存個模板 是用分治寫的時間複雜度 nlogn 但是本題好像還有一種玄學做題法 我們充分發揚人類智慧型 將所有點全部繞原點旋轉同乙個角度,然後按x座標排序 根據數學直覺,在隨機旋轉後,答案中的兩個點在陣列中肯定不會離得太遠 所以我們只取每個點向後的5個點來計算答案 這樣速度快得飛起,在n 100000...
平面最近點對 n 2和nlogn做法 計算幾何
題目描述 給定平面上n個點,找出其中的一對點的距離,使得在這n個點的所有點對中,該距離為所有點對中最小的。既然是暴力做法,那肯定是非常非常暴力的做法,無疑是列舉。列舉i從1 n,j從i 1 n,用距離公式計算出第i個點和第j個點的距離,然後找到最小值即可。放一道模板題吧!ac include inc...
三點順序(計算幾何入門)
現在給你不共線的三個點a,b,c的座標,它們一定能組成乙個三角形,現在讓你判斷a,b,c是順時針給出的還是逆時針給出的?如 圖1 順時針給出 圖2 逆時針給出 每行是一組測試資料,有6個整數x1,y1,x2,y2,x3,y3分別表示a,b,c三個點的橫縱座標。座標值都在0到10000之間 輸入0 0...