标签:des style class blog code http
2 0 0 1 1 2 1 1 1 1 3 -1.5 0 0 0 0 1.5 0
0.71 0.00 0.75
题目大意:
给你很多点,问你最近点的距离一半是多少。
解题思路:
最近点对,参照:http://blog.csdn.net/hellobabygogo3/article/details/8042650
解题代码:(参照它的思路,感觉我的代码比较简洁一些)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=110000;
struct point{
double x,y;
double getdis(point p){
return sqrt( (x-p.x)*(x-p.x)+(y-p.y)*(y-p.y) );
}
friend bool operator < (point a,point b){
if(a.x!=b.x) return a.x<b.x;
else return a.y<b.y;
}
}p[maxn];
int n;
bool cmp(point a,point b){
if(a.y!=b.y) return a.y<b.y;
else return a.x<b.x;
}
double getmin(int l,int r){
if(r-l==0) return 1e18;
if(r-l==1) return p[l].getdis(p[r]);
int mid=(l+r)/2;
double ans=min( getmin(l,mid),getmin(mid+1,r) );
vector <point> v;
for(int i=l;i<r;i++){
if( fabs(p[i].x-p[mid].x) < ans ) v.push_back(p[i]);
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<v.size();i++){
for(int j=i+1;j<v.size();j++){
if(v[j].y-v[i].y>=ans) break;
double tmp=v[j].getdis(v[i]);
if(tmp<ans) ans=tmp;
}
}
return ans;
}
void solve(){
double ans=1e18;
sort(p,p+n);
printf("%.2lf\n",getmin(0,n-1)/2.0);
}
int main(){
while(scanf("%d",&n)!=EOF && n>0){
for(int i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
solve();
}
return 0;
}
HDU 1007 Quoit Design (分治),布布扣,bubuko.com
标签:des style class blog code http
原文地址:http://blog.csdn.net/a1061747415/article/details/28441285