方法:选取一个点A,以点A为圆心做一个半径为r的圆,然后枚举另一个点B,以B为圆心做一个圆,如果这两个圆有交集,那我们在这个交集内选取一个点做半径为r的圆,这个圆就包括了A和B点,找到交集最多的区域并计算这个区域被覆盖的次数,把这个数加一就是最多能够覆盖的点个数,枚举所有的A,就可以得到最优解,剩下我想说的都在下面的图里,代码里也有相关注释;

  这个题在比赛的时候我们并没有做出来,赛后看了题解才知道,由于作者的代码风格很好,所以不做修改,下面是作者的原博客地址:

http://www.cnblogs.com/CSGrandeur/archive/2012/09/10/2678682.html

  下面这个图片有助于理解代码

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std ;
const double eps = 1e-;
const double PI = acos(-1.0) ;
int n ;
double r ;
struct point
{
double x,y ;
} p[] ;
struct node
{
double angle ;
int flag ;
} q[] ;
int dcmp(double d)
{
return d < -eps ? - : d > eps ;
}
bool cmp(const node &a,const node &b)///角度区间排序,区间上限永远在上;
{
if(dcmp(a.angle-b.angle) == ) return a.flag > b.flag ;
return a.angle < b.angle ;
}
double Cal(double x)
{
return x*x ;
}
double dist(const point &a,const point &b)
{
return sqrt(Cal(a.x-b.x)+Cal(a.y-b.y)) ;
} int main()
{
while(~scanf("%d%lf",&n,&r))
{
if(n == ) break ;
for(int i = ; i < n ; i++)
scanf("%lf%lf",&p[i].x,&p[i].y) ;
int ans = ,m = ;
for(int i = ; i < n ; i++)
{
m = ;
for(int j = ; j < n ; j++)
{
if(i == j) continue ;
double d = dist(p[i],p[j]) ;
if(d > *r+0.001) continue ;
double s = atan2(p[j].y-p[i].y,p[j].x-p[i].x) ;
///atan2 和 atan 的区别;
///1:参数的填写方式不同;
///2:atan2 的优点在于 如果 x2-x1等于0 依然可以计算,但是atan函数就会导致程序出错;
if(s < ) s += *PI ;///角度区间修正
double ph = acos(d/2.0/r) ;///圆心角转区间
q[m++].angle = s - ph + *PI ;///图中b-a,避免负值+2*PI;
q[m-].flag = ;///标记为上界
q[m++].angle = s + ph + *PI ;///图中a+b;
q[m-].flag = - ;///标记下界
}
sort(q,q+m,cmp) ;
int sum = ;
for(int j = ; j < m ; j++)///这种记录区间最大交集次数的方式很巧妙,当时我对这里还是挺困惑的,读者若不懂应稍加思考.
ans = max(ans,sum += q[j].flag) ;
}
/*for(int j = 0; j < m; j++)
{
cout<<"angle = "<<q[j].angle<<endl;
cout<<"flag = "<<q[j].flag<<endl;
}*/
printf("It is possible to cover %d points.\n",ans+) ;
}
return ;
}

HDU 1883 Phone Cell(计算几何)的更多相关文章

  1. HDU 1883 Phone Cell (圆覆盖最多点)

    题目链接 题意 : 给你很多点和一个半径r,这个半径为r的圆能覆盖的最多的点是多少. 思路 : 对每个点做半径为 r 的圆, 求交集,交集最多的区域的被覆盖次数就是能覆盖的最多的点.贴两个链接,分析的 ...

  2. HDU 5130 Signal Interference(计算几何 + 模板)

    HDU 5130 Signal Interference(计算几何 + 模板) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5130 Descripti ...

  3. HDU 4063 Aircraft(计算几何)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4063 Description You are playing a flying game. In th ...

  4. hdu 1174:爆头(计算几何,三维叉积求点到线的距离)

    爆头 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...

  5. HDU 5979 Convex【计算几何】 (2016ACM/ICPC亚洲区大连站)

    Convex Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  6. hdu 4631Sad Love Story<计算几何>

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4631 题意:依次给你n个点,每次求出当前点中的最近点对,输出所有最近点对的和: 思路:按照x排序,然后用s ...

  7. HDU 4606 Occupy Cities (计算几何+最短路+最小路径覆盖)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题目:给出n个城市需要去占领,有m条线段是障碍物, ...

  8. 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】

    CSGO Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  9. HDU 5839 Special Tetrahedron 计算几何

    Special Tetrahedron 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...

随机推荐

  1. Chapter 2 Open Book——21

    I kept my head down and glanced up under my lashes. 我一直保持低着头并且在睫毛之下瞟了一眼. None of them were looking t ...

  2. 裸二分图匹配poj1469

    poj1496 题意: 给你p门课程和n个学生,一个学生可以选0门,1门,或者多门课程, 现在要求一个由p个学生组成的集合,满足下列2个条件: 1.每个学生选择一个不同的课程 2.每个课程都有不同的代 ...

  3. 利用npoi把多个DataTable导入Excel多个sheet中

    { 题外拓展:把datatable插入dataset DataTable fuben = new DataTable();//定义的datatablefuben = table.Tables[0].C ...

  4. php的错误和异常处理

    php中try catch的例子: <?php try { if (@mysql_connect('localhost','root','123456')){ // echo 'success! ...

  5. win8.1下安装ubuntu 14.0 4LTS

    1.前奏 电脑上已经安装了win8.1系统 2.准备工作 关闭win8.1的快速启动 步骤: 控制面板->电源选项->选择电源按钮的功能->更改不可用的设置,然后把"启用快 ...

  6. Hibernate Session & Transaction详解

    Hibernate Session & Transaction详解 HIbernate中的Session Session是JAVA应用程序和Hibernate进行交互时使用的主要接口,它也是持 ...

  7. XListview的下拉刷新、上拉加载、用Pull解析XML

    做之前需要导入XListview的文件,此是用第三方的xListview实现的,东西没写全.此是在Fragment中实现的 //--------------XListView的布局---------- ...

  8. gcc 优化选项 -O1 -O2 -O3 -Os 优先级,-fomit-frame-pointer

    英文:https://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Optimize-Options.html#Optimize-Options 少优化->多优化: ...

  9. over-float清除浮动++隐藏溢出

    overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解.一提到清除浮动,我们就会想到另外一个CSS样式: ...

  10. js框架——angular.js

    这是一个前端用的框架,使用简单.详细介绍这里就不写了,主要介绍其语法和作用—— 1. 声明一个angular 如果想要使用一个angular代码,则需要在[想要使用angular的范围内写上ng-ap ...