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

 

转载于:https://www.cnblogs.com/Cw-trip/p/4676880.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值