生活随笔
收集整理的這篇文章主要介紹了
hdu_1007_Quoit Design(最近点对)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目連接:hdu_1007_Quoit Design
題意:
給你平面上的一些點,讓你找出這些點的最近點對的距離
題解:
采用分治,達到O(nlognlogn)的時間復雜度就能艸過去了
1 #include<stdio.h>
2 #include<
string.h>
3 #include<algorithm>
4 #include<math.h>
5 using namespace std;
6 //O(nlognlogn)找最近點對
7 const int N=1e5+
7;
8 struct TPoint
9 {
10 double x,y;
11 }ply[N],ans[N];
12 int n;
13 inline
double MIN(
double a,
double b) {
return a<b?
a:b;}
14 bool cmpx(TPoint a,TPoint b) {
return a.x<
b.x;}
15 bool cmpy(TPoint a,TPoint b) {
return a.y<
b.y;}
16 double dist(TPoint a,TPoint b)
17 {
18 double s1=a.x-
b.x;
19 double t1=a.y-
b.y;
20 return sqrt(s1*s1+t1*
t1);
21 }
22 double closest(
int l,
int r)
23 {
24 if(l+
1==r)
return dist(ply[l],ply[r]);
//2點
25 else if(l+
2==r)
//三點
26 return MIN(dist(ply[l],ply[l+
1]),MIN(dist(ply[l],ply[r]),dist(ply[l+
1],ply[r])));
27 int i,j,mid,cnt;
28 mid=(l+r)>>
1;
29 double mi=MIN(closest(l,mid),closest(mid+
1,r));
//遞歸解決
30 for(i=l,cnt=
0;i<=r;i++)
//相鄰點符合
31 {
32 if(fabs(ply[i].x-ply[mid].x)<=
mi)
33 ans[cnt++]=
ply[i];
34 }
35 sort(ans,ans+cnt,cmpy);
//按y排序
36 for(i=
0;i<cnt;i++)
for(j=i+
1;j<cnt;j++)
//更新最小距離
37 {
38 if(ans[j].y-ans[i].y>=mi)
break;
39 mi=
MIN(mi,dist(ans[i],ans[j]));
40 }
41 return mi;
42 }
43 int main()
44 {
45 while(scanf(
"%d",&
n),n)
46 {
47 int i;
48 for(i=
0;i<n;i++) scanf(
"%lf%lf",&ply[i].x,&ply[i].y);
//輸入點
49 sort(ply,ply+n,cmpx);
//按x排序
50 double mi=closest(
0,n-
1);
51 printf(
"%.2lf\n",mi/
2);
52 }
53 return 0;
54 }
View Code ?
轉(zhuǎn)載于:https://www.cnblogs.com/bin-gege/p/5696074.html
總結(jié)
以上是生活随笔為你收集整理的hdu_1007_Quoit Design(最近点对)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。