POJ-1328(Radar Installation)
程序员文章站
2022-03-24 14:17:06
...
题意:以X轴为海岸线,X轴上方为海,海中会有一些点表示岛屿,先有扫描半径为 d 的雷达需要安装在海岸线上,现有 n 个岛屿,求最少需要半径为 d 的雷达多少个才能完全覆盖 所有的岛屿,若无解输出 -1
分析:无解的情况只能是某个岛屿的纵坐标大于 d ,而对于一个岛屿,若有解,则可以扫描到它的雷达的区间 [ L,R ] 则是
(图略丑。。)
[ x-sqrt(d*d-y-y) , x+sqrt(d*d-y-y) ],这样我们可以为每个岛屿点找到它的雷达安置区间,每个区间至少一枚,因为要做到最少,所以按R优先,L次从小到大排序然后遍历,设上一个安放雷达的点为 now ,若当前判断岛屿的左边界 L > now ,则表明岛屿内还没有雷达,我们就在右边界 R 放置一个雷达(因为这个区间必须安装一枚,安装在右边界对后面的点最有益)
代码:
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
double l,r;
node(){}
node(double _l,double _r)
{
l=_l,r=_r;
}
}p[1001];
bool cmp(node a,node b)
{
if(a.r!=b.r) return a.r<b.r;
return a.l<b.l;
}
int n;
double d;
int main()
{
int T=0;
while(~scanf("%d%lf",&n,&d)&&(n&&d))
{
T++;
bool flag=0;
for(int i=0;i<n;i++)
{
double x,y;
scanf("%lf%lf",&x,&y);
if(y>d||y<-d)
{
flag=1;
continue;
}
double dis=sqrt(d*d-y*y);
p[i]=node(x-dis,x+dis);
}
if(d<0||flag)
{
printf("Case %d: -1\n",T);
continue;
}
sort(p,p+n,cmp);
double now=-0x3f3f3f3f;
int cnt=0;
for(int i=0;i<n;i++)
{
if(now<p[i].l)
{
now=p[i].r;
cnt++;
}
}
printf("Case %d: %d\n",T,cnt);
}
}
上一篇: 女娲后人为什么是蛇身人首?真相是
推荐阅读
-
The packaging and installation process of Android programs
-
AndroidStudio更新时报错:Connection Error,Temp directory inside installation
-
Realcase: Failed to upgrade SQL Server 2016 SP2 CU11. (Installation success or error status: 1648)
-
Ubuntu安装telent服务器时出现:apt-get:Package has no installation的原因及解决方法
-
The packaging and installation process of Android programs
-
[转发] Apache SSL Certificate Installation
-
Rails4 Web installation
-
Rails4 Web installation
-
kali遇到“已安装的 post-installation 脚本 返回了错误的问题的解决
-
使用IntelliJ IDEA导入 Flink 消费kafka报错 Error: A JNI error has occurred, please check your installation an