POJ-1328(Radar Installation)

题意:以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);
	}
} 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值