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;
}
求这个圆最多覆盖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;
}
相关文章推荐
- hdu 1498 50 years, 50 colors(最小覆盖点数)
- HDU 1565 方格取数(1)(最大独立点权覆盖 | 最小割)
- hdu 4160 Dolls--最小点集覆盖=V-二分图最大匹配
- HDU 1150 Machine Schedule 最小点覆盖数==最大匹配数
- hdu 3360 National Treasures 最小顶点覆盖(最大匹配)
- 最小覆盖点数=最大匹配数
- hdu 1565 最小点权覆盖(最大流EK)
- 最小点权覆盖 && 最大点权独立集 zoj 3165 hdu 1565 poj 2125
- 二分图最小覆盖点数(最大匹配):Machine Schedule
- hdu 1054 Strategic Game(模板) 最大二分匹配,最小点覆盖 匈牙利算法
- hdu 1569 最小点权覆盖(最大流EK)
- HDU 1528 (二分图最大匹配 + 最小覆盖, 14.07.17)
- HDU 4862 Jump(最大k路径覆盖 费用流)
- 树形DP 或 最小顶点覆盖=最大匹配(双向图)(HDU 1053)
- HDU 1151 Air Raid(最小路径覆盖 = 顶点数 - 最大匹配数)
- HDU-1150(求最小覆盖顶点数=二分最大匹配数)
- HDU 1151Air Raid 最小路径覆盖=n-最大匹配量 (第二道二分匹配)
- HDU 1150 Machine Schedule(最小点覆盖数 = 最大匹配数)
- HDU 3722 最大效益圈覆盖
- HDU 1151Air Raid 最小路径覆盖=n-最大匹配量 (第二道二分匹配)