您的位置:首页 > 其它

hdu 1077 圆覆盖的最大点数

2017-10-30 20:36 204 查看
题目大意:给你一个半径为1的圆,再给你n个点,

求这个圆最多覆盖n个点中的几个。

 

思路:枚举两个在圆上的点确定一个圆的圆心,

然后枚举出一共有多少点能被这个圆覆盖,求出其中最多的数目。

注意:要注意会用在圆上的两个点以及圆的半径求出圆心!

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define INF 99999999
#define uf 1e-8
#define maxn 400
#define LL long long
using namespace std;
typedef struct node
{
double x,y;
}pointy;
double dis(pointy a,pointy b)//求两点距离的平方
{
double ans;
ans=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
return ans;
}
pointy circlepoint(pointy a,pointy b)//求圆心
{
pointy m,z;
double xx=a.x-b.x;
double yy=a.y-b.y;
m.x=(a.x+b.x)/2.0;
m.y=(a.y+b.y)/2.0;
double an=sqrt(1.0-dis(a,m));
if(fabs(xx)<uf)//如果两点两线与x轴接近平行,此时tan a 为无穷大
{
z.x=m.x;
z.y=m.y+an;
}
else
{
double ang=atan(-xx/yy);
z.x=m.x+an*cos(ang);
z.y=m.y+an*sin(ang);
}
return z;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
pointy a[maxn];
for(int i=0;i<n;i++)
{
cin>>a[i].x>>a[i].y;
}
int ans=1;
int cnt;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(dis(a[i],a[j])<=4.0)//如果两点可以在圆上
{
pointy z=circlepoint(a[i],a[j]);
cnt=0;
for(int k=0;k<n;k++)
{
if(sqrt(dis(z,a[k]))<=1.00000001)
cnt++;
}
if(ans<cnt)
ans=cnt;
}
}
}
cout << ans << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: