欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

POJ-1328(Radar Installation)

程序员文章站 2022-03-24 14:17:06
...

题意:以X轴为海岸线,X轴上方为海,海中会有一些点表示岛屿,先有扫描半径为 d 的雷达需要安装在海岸线上,现有 n 个岛屿,求最少需要半径为 d 的雷达多少个才能完全覆盖 所有的岛屿,若无解输出 -1

 

分析:无解的情况只能是某个岛屿的纵坐标大于 d ,而对于一个岛屿,若有解,则可以扫描到它的雷达的区间 [ L,R ] 则是

POJ-1328(Radar Installation)(图略丑。。)

[ 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);
	}
} 

 

 

相关标签: 思维