poj1981(几何极限情况)

该博客探讨了一种算法,用于解决在给定点集中,一个半径为1的圆能覆盖最多多少个点的问题。通过枚举两个点作为圆的边界,并计算包含的点数,找到覆盖最多的解决方案。文章还提到了更高效的算法,通过枚举一个点,确定圆心位置以覆盖最多点。最后,博客提供了C++代码实现。
摘要由CSDN通过智能技术生成
/*
translation:
	给出若干个点的位置,求一个半径为1的圆最多能够覆盖多少个点?
solution:
	极限情况
	先枚举两个点,假设这两个点恰好在圆上。然后计算这个圆包含的点个数即可。
note:
	* 还有一种更为高效的写法,枚举一个点,假设该点在圆x上,则圆心必然在以该点为圆心的圆i上。此时x要覆盖尽量多的点,
	  所以对以枚举的点为圆心的圆求出和其他点为圆心的圆的交点,被覆盖最多次的那段弧就是圆x圆心所在的位置。
*/
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>

using namespace std;
const int maxn = 300 + 5;

struct Point
{
	double x, y;
	Point(){}
	Point(double x_, double y_):x(x_),y(y_){}
};
typedef Point Vector;

struct Circle
{
	Point c;
	double r;
	Circle(Point c, double r):c(c),r(r){}
	Point point(double a) {
		return Point(c.x + cos(a) * r, c.y + sin(a) * r);
	}
};

Vector operator + (Vector a, Vector b) 	{ return Vector(a.x + b.x, a.y + b.y); }
Vector operator - (Point a, Point b) 	{ return Point(a.x - b.x, a.y - b.y); }
Vector operator * (Vector a, double p) 	{ return Vector(a.x * p, a.y * p); }
Vector op
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值