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

 

你可能感兴趣的:(HDU)