题意:如今我们位于沿海地区,需要安装大炮,使得火力可以覆盖整个区域。海岸线可以视为是无限长的直线。陆地位于海岸线的一侧,海洋位于另一侧。海洋里有若干个岛屿,每个小岛可以视为海洋中的一个点。我们需要在海岸线上安装大炮,每个大炮智能覆盖距离d,因此海洋中的小岛被大炮安装所覆盖的条件是两者间的距离不超过 d 。 我们将海岸线视为 x 轴。海洋的一侧位于 x 轴上方,陆地的一侧位于下方。给定海洋中每个小岛的位置(以xy坐标给出),并给定大炮的覆盖距离,你需要写程序,找出安装大炮的最少数量,使得所有的小岛都被覆盖。

题解:我们先将所有的岛屿视为圆心,以半径d做圆,如果最远距离大于d的,直接视为无法完全覆盖,输出-1;

如果全部可以覆盖,则可以认为x轴对于圆的割线就是满足题意的炮台位置,此时本题就转化为了贪心问题中的基操——区间选点问题

区间选点问题的题型:n个区间[ai,bi],在数轴上选取尽可能少的点,能保证每段区间上都能有一个点。

区间选点的贪心策略:右端点从小到大排序,如果右端点相同则左端点从大到小排序

贪心过程:标记第一个右端点为r,不断向后与下一段的左端点开始比较,如果下一段的左端点大于r,则更新r,否则一直向后找


#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std; struct node {
double x;
double y;
}island[];
struct point {
double l;
double r;
}p[];
bool cmp(point a, point b)
{
if (a.r == b.r)
return a.l > b.l;
return a.r < b.r;
}
int main(void)
{
ios::sync_with_stdio(false);
int n;
double d;
int k = ;
while (cin >> n >> d)
{
if (n == && d == ) break;
int flag = ;
for (int i = ; i < n; i++)//n是海洋中小岛的数目,d是大炮可以覆盖的距离
{
cin >> island[i].x >> island[i].y;
if (island[i].y > d || island[i].y < )
flag = ;
else
{
p[i].l = double(island[i].x - sqrt(d * d - island[i].y * island[i].y));
p[i].r = double(island[i].x + sqrt(d * d - island[i].y * island[i].y));
}
}
if (flag == )
{
cout << "Case " << k << ": " << "-1" << endl;
k++;
}
else
{
sort(p, p + n, cmp);
double r = p[].r;
int count = ;
for (int i = ; i < n; i++)
{
if (p[i].l <= r)
continue;
else
{
count++;
r = p[i].r;
}
}
cout << "Case " << k << ": " << count << endl;
k++;
}
}
return ;
}

最新文章

  1. 【Kindle】pdf转mobi适合kindle查看格式
  2. SQL Server Replication 中关于视图的点滴
  3. CentOS 6.5 PPTPD VPN服务器安装,解决807等问题。
  4. CSS---解决内容过多就会出文本溢出(显示在区域外面,不换行的情况)
  5. android 点击屏幕关闭 软键盘
  6. android 2.2 videoView 诡异bug
  7. java的System.getProperty()方法可以获取的值
  8. POJ2001Shortest Prefixes(字典树)
  9. C++对象的JSON序列化与反序列化探索续-复杂对象的序列化与反序列化
  10. SSAS系列——【03】多维数据(多维数据集对象)
  11. Python2和Python3中的字符串编码问题解决
  12. [BZOJ1046] [HAOI2007] 上升序列 (dp)
  13. Exchange Server 内部版本号和发行日期汇总
  14. word 2013 标题设置多级列表
  15. java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory的解决
  16. python3 网页下拉框和悬浮框操作基础汇总
  17. python设计模式第七天【建造者模式】
  18. ext与xfs文件系统比较与总结
  19. react属性绑定
  20. Hash Tables

热门文章

  1. 我们为什么要用hibernate
  2. @Component、@Service、@Controller、@Rrepository说明
  3. dB是乘以10还是乘以20
  4. 点击提交按钮,屏幕会出现闪烁问题,element.style问题
  5. selenium(9)- Xpath的详细使用
  6. 使用DragonFly进行智能镜像分发
  7. 原来你是这样的BERT,i了i了! —— 超详细BERT介绍(一)BERT主模型的结构及其组件
  8. 自由切换 网页上的 ico 图标
  9. HTML5如何垂直居中一个浮动元素
  10. 【DMCP】2020-CVPR-DMCP Differentiable Markov Channel Pruning for Neural Networks-论文阅读