HDU 1883 Phone Cell(计算几何)
方法:选取一个点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(计算几何)的更多相关文章
- HDU 1883 Phone Cell (圆覆盖最多点)
题目链接 题意 : 给你很多点和一个半径r,这个半径为r的圆能覆盖的最多的点是多少. 思路 : 对每个点做半径为 r 的圆, 求交集,交集最多的区域的被覆盖次数就是能覆盖的最多的点.贴两个链接,分析的 ...
- HDU 5130 Signal Interference(计算几何 + 模板)
HDU 5130 Signal Interference(计算几何 + 模板) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5130 Descripti ...
- 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 ...
- hdu 1174:爆头(计算几何,三维叉积求点到线的距离)
爆头 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...
- HDU 5979 Convex【计算几何】 (2016ACM/ICPC亚洲区大连站)
Convex Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- hdu 4631Sad Love Story<计算几何>
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4631 题意:依次给你n个点,每次求出当前点中的最近点对,输出所有最近点对的和: 思路:按照x排序,然后用s ...
- HDU 4606 Occupy Cities (计算几何+最短路+最小路径覆盖)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题目:给出n个城市需要去占领,有m条线段是障碍物, ...
- 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 ...
- HDU 5839 Special Tetrahedron 计算几何
Special Tetrahedron 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...
随机推荐
- C++编写一个简单的DLL
什么是DLL: 自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上 Windows操作系统中几乎所有的内容都由DL ...
- cmd 下登陆ftp及相关操作
cmd 下登陆ftp及相关操作 2011-08-09 20:34:28| 分类: 小技巧|字号 订阅 一.举例 假设FTP地址为“ 61.129.83.39”(大家试验的时候不要以这个FTP去试,应 ...
- 用jQuery写的最简单的表单验证
近几天完成了关于我们项目的最简单的表单验证,是用jQuery写的,由于之前也一直没学过jQuery,所以自己也是一直处于边摸索边学习的阶段,经过这一段时间的学习,通过查资料啥的,也发现了学习jQuer ...
- cdn是什么
CDN的全称是Content Delivery Network,即内容分发网络.其目的是通过在现有的Internet中增加一层新的网络架构, 将网站的内容发布到最接近用户的网络”边缘”,使用户可以就近 ...
- 安卓srcCompat弄死我了
<ImageView android:layout_width="150dp" android:layout_height="120dp" app:src ...
- [Java]知乎下巴第0集:让我们一起来做一个知乎爬虫吧哦耶【转】
文章来源:http://jp.51studyit.com/article/details/16203.htm 作者: 汪海洋 身边的小伙伴们很多都喜欢刷知乎,当然我也不例外, 但是手机刷太消耗流量, ...
- linux 常用端口
常用端口 下面的表格中列举了包括在红帽企业 Linux 中的服务.守护进程.和程序所使用的最常见的通信端口.该列表还可以在 /etc/services 文件中找到.要查看由互联网号码分派局(IANA) ...
- curl 测试web站点的响应时间
curl -s -w "\n"::%{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total} ...
- 从拉动APP下载谈运营
声明:这篇文章是前京东产品运营刘玮东的作品,我转过来主要方便以后自己温故,也怕这样的好文给漏或者找不到了. 当时面临的新课题就是如何用H5拉动APP的下载,背景是我们的渠道和发动传播的第一波用户不够多 ...
- ReactiveCocoa 浅析
转载自:http://limboy.me/ios/2013/12/27/reactivecocoa-2.html ReactiveCocoa是Github开源的一款cocoa FRP 框架,我在之 ...