HDU 4173(计算几何

题意:给出若干个点,求半径为2.5的圆最多包含多少个点。

思路:查到的一篇题解是枚举三个点的外接圆,这个对于我等计算几何小白来说还是不太好做。。。。后来听大神讲的,因为半径已知,所以只需要枚举经过两点的半径为2.5的所有圆就好(两个点对应两个圆),这样不仅好写,而且复杂度也降低了。

(感觉不用一大串模板都不好意思叫计算几何了。。。。。)

#include<iostream>
#include<map>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<queue>
#include<stack>
#include<functional>
#include<set>
#include<cmath>
#define pb push_back
#define fs first
#define se second
#define sq(x) (x)*(x)
#define eps 0.0000000001
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
const int maxv=250;
double x[maxv],y[maxv];
int n;
double cycx[maxv*maxv+30];
double cycy[maxv*maxv+30];
int cych=0;
double dis(double x1,double y1,double x2,double y2){
    return sqrt(sq(x1-x2)+sq(y1-y2));
}
void getcenter(double x1,double y1,double x2,double y2){
    double mx=(x1+x2)/2,my=(y1+y2)/2;
    double k=(y1-y2)/(x1-x2);
    k=-1/k;
    if(x1-x2==0) k=0;
    double dis1=dis(x1,y1,x2,y2);
    dis1/=2;
    double dis2=sqrt(sq(2.5)-sq(dis1));
    double dx1=1./sqrt(1+k*k)*dis2,dy1=k/sqrt(1+k*k)*dis2;
    double dx2=-dx1,dy2=-dy1;
    cycx[cych++]=mx+dx1,cycy[cych-1]=my+dy1;
    cycx[cych++]=mx+dx2,cycy[cych-1]=my+dy2;
}
int main(){
    freopen("/home/files/CppFiles/in","r",stdin);
/*    std::ios::sync_with_stdio(false);
    std::cin.tie(0);*/
    while(cin>>n){
        for(int i=0;i<n;i++) scanf("%lf%lf",x+i,y+i);
        cych=0;
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(dis(x[i],y[i],x[j],y[j])<5+eps);
                getcenter(x[i],y[i],x[j],y[j]);
            }
        }
        int ans=1;
        for(int i=0;i<cych;i++){
            int cont=0;
            for(int j=0;j<n;j++){
                if(dis(x[j],y[j],cycx[i],cycy[i])<2.5+eps){
                    cont++;
                }
            }
            ans=max(ans,cont);
        }
        cout<<ans<<endl;
    }
    return 0;
}
View Code

 

posted @ 2015-07-26 00:10  PlusSeven  阅读(169)  评论(0编辑  收藏  举报