【题目链接】:http://poj.org/problem?id=1981

【题意】



给你n个点(n<=300);

然后给你一个半径R;

让你在平面上找一个半径为R的圆;

这里R=1

使得这个圆覆盖的点的数目最多;

【题解】



最少会有一个点;

考虑两个点的情况;

枚举任意两个点在圆上;

考虑最极端的情况;

就是这两个点都在圆的边上;(这样圆心就尽可能地远离它们俩了,以求让这个圆覆盖更多的点);

然后求出这个时候这时的圆心的坐标;

然后看看其他的在这个圆内的点的数目就好;

圆心的话只要求一边的圆心就可以了;

不会证。

这里圆心的坐标我是用数学方法推导出来的;

可以这样

假设圆心坐标为a,b;

两个点为(x1,y1),(x2,y2)

然后根据

sqrt(a−x1)+sqrt(b−y1)=R2⋅⋅⋅⋅①

sqrt(a−x2)+sqrt(b−y2)=R2⋅⋅⋅⋅②

两式相减;

可以得到圆心所在的直线满足的方程也即得到a用b表达的形式;

然后回带入①②两个等式中任意一个;

然后解一元二次方程

得到b

从而得到a

(x1==x2的情况需要特判一下)



【Number Of WA】



0



【完整代码】

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 310; struct point
{
double x,y;
}; point t[N];
int n; double sqr(double t)
{
return t*t;
} double dis(point a,point b)
{
return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
} point get_yx(point q,point w)
{
double R = 1.0;
double x1 = q.x,y1 = q.y;
double x2 = w.x,y2 = w.y;
double a,b,A,B;
if (fabs(x1-x2)<1e-5)
{
b = (y1+y2)/2.0;
double td = dis(q,w);
a = x1+sqrt(sqr(R)-sqr(td/2.0));
}
else
{
A=(y1-y2)/(x2-x1),B=(sqr(x2)-sqr(x1)+sqr(y2)-sqr(y1))/(2.0*(x2-x1));
double m1 = (sqr(A)+1),m2 = 2*A*B-2*y1-2*A*x1;
double m3 = sqr(x1)+sqr(B)-2*B*x1+sqr(y1)-sqr(R);
b=(-m2+sqrt(sqr(m2)-4*m1*m3))/(2*m1);
a = A*b+B;
}
point temp;
temp.x = a,temp.y = b;
return temp;
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
ios::sync_with_stdio(false);
// point dd = get_yx(point{0,1},point{1,0});
//cout << fixed << setprecision(6) <<dd.x<<' '<<dd.y<<endl;
//return 0;
while (cin>>n)
{
if (n==0) break;
rep1(i,1,n)
cin >> t[i].x>>t[i].y;
int ans = 1;
rep1(i,1,n-1)
rep1(j,i+1,n)
{
double d = dis(t[i],t[j]);
if (d>2.0) continue;
point Q = get_yx(t[i],t[j]);
int temp = 0;
rep1(k,1,n)
if (dis(t[k],Q)<1+1e-4)
temp++;
ans = max(ans,temp);
}
cout << ans << endl;
}
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}

【POJ 1981】Circle and Points(已知圆上两点求圆心坐标)的更多相关文章

  1. 已知圆上三个点坐标,求圆半径 r 和 圆心坐标

    问题: 已知圆上三个点坐标分别为(x1,y1).(x2,y2).(x3,y3) 求圆半径R和圆心坐标(X,Y) X,Y,R为未知数,x1,y1,x2,y2,x3,y3为常数 则由圆公式:(x1-X)² ...

  2. poj 1981 Circle and Points

    Circle and Points Time Limit: 5000MS   Memory Limit: 30000K Total Submissions: 8131   Accepted: 2899 ...

  3. POJ 1981 Circle and Points (扫描线)

    [题目链接] http://poj.org/problem?id=1981 [题目大意] 给出平面上一些点,问一个半径为1的圆最多可以覆盖几个点 [题解] 我们对于每个点画半径为1的圆,那么在两圆交弧 ...

  4. 转 已知两点坐标和半径求圆心坐标程序C++

      数学思想:利用圆方程和直线方程 已知两点坐标和半径求圆心坐标程序 #include <iostream> #include <fstream> #include <c ...

  5. TZOJ 3209 后序遍历(已知中序前序求后序)

    描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义:  ...

  6. python应用-已知三角形的边长求他的面积和周长

    """ 已知三角形的边长求他的面积和周长 Author:罗万财 Date:2017-3-3 """ import math a=float( ...

  7. 2019-8-31-C#-已知点和向量,求距离的点

    title author date CreateTime categories C# 已知点和向量,求距离的点 lindexi 2019-08-31 16:55:58 +0800 2018-05-08 ...

  8. HTML5地理定位(已知经纬度,计算两个坐标点之间的距离)

    事实上,地球上任意两个坐标点在地平线上的距离并不是直线,而是球面的弧线. 下面介绍如何利用正矢公式计算已知经纬度数据的两个坐标点之间的距离.半正矢公式也成为Haversine公式,它最早时航海学中的重 ...

  9. C语言:已知三角形三边长求面积

    //已知三角形三边长求面积 #include <stdio.h> #include <math.h> int main() { float a,b,c,p,s; int x=0 ...

随机推荐

  1. windows 下 opencv 3.x 的安装及常见问题的解决

    1. 下载与配置 下载地址:Releases - OpenCV library(选择合适的平台和版本) 配置步骤见:VS 2013 统一修改所有工程的目录配置(以 boost.opencv3 的安装为 ...

  2. 38. ExtJS学习(四)EditorGrid可编辑表格

    转自:https://blog.csdn.net/qq_30739519/article/details/50865060

  3. springAOP注解方式定义切入点报错error at ::0 can't find referenced pointcut

    [说明] 1.使用spring版本:4.0.4 2.springAOP相关依赖包: 1)aopalliance-1.0.jar 2)aspectjweaver-1.8.9.jar 3)aspectjr ...

  4. Ubuntu下FileZilla的安装(转载)

    转自:http://os.51cto.com/art/201103/247564.htm FileZilla是一个免费而且开源的FTP客户端软件,共有两种版本:客户端版本.服务器版本.FileZill ...

  5. 如何使js函数异步执行

    CallbacksCallbacks使用场景在哪里?在很多时候需要控制一系列的函数顺序执行.那么一般就需要一个队列函数来处理这个问题: function Aaron(List, callback) { ...

  6. Git 迁库 标签

    Git迁库 (一)克隆裸库 git clone --bare https://github.com/SunArmy/Tourist.git 克隆之后进入该目录下是这样的 (二)创建新的版本库 这里我已 ...

  7. 【题解】动态逆序对 [CQOI2011] [P3157] [BZOJ3295] [P1393]

    [题解]动态逆序对 [CQOI2011] [P3157] [BZOJ3295] [P1393] 水一水QAQ 题目链接: \([P3157]\) \([BZOJ3295]\) [题目描述] 对于一个序 ...

  8. C++ Primer(第4版)-学习笔记-第2部分:容器和算法

    第9章 顺序容器 顺序容器和关联容器 顺序容器内的元素按其位置存储和访问. 关联容器,其元素按键(key)排序. 顺序容器(sequential container). 顺序容器的元素排列次序与元素值 ...

  9. 原生js实现简单的焦点图效果

    用到一些封装好的运动函数,主要是定时器 效果为图片和图片的描述定时自动更换 <!DOCTYPE html> <html> <head> <meta chars ...

  10. hdu3535题解

    hdu3535:http://acm.hdu.edu.cn/showproblem.php?pid=3535 该题是非常全面的一道分组背包问题.其实理解了最多一个的分组背包问题,解题起来也是很简单的. ...