【解题报告】 POJ1328 雷达设备

【解题报告】 POJ1328 雷达设备

题目:雷达设备(已翻译)

解题思路:

贪心。

这道题只需要将x轴上方的一些建筑物,利用勾股定理算出x轴上一段能管辖它的区间,所以问题就变成了给定n个区间,在x轴上放置最少的点,使每个区间至少包含一个点,但是,特别地,如果建筑物的纵坐标超出了每个雷达管辖的半径,就直接不会继续下去了,因为不管怎么样,那个建筑物都无法被管辖,所以我们只需要每个建筑物算出来的区间的右端点进行排序,然后设置一个数组vis,来记录每个建筑物是否被管辖到,然后就ok了

AC代码

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1005;
int n,d;
int ans;
bool vis[maxn];
struct sec
{
	double l;
	double r;
}b[maxn];
bool cmp(sec p,sec q)
{
	return p.r<q.r;
}
int main()
{
	cin>>n>>d;
	for(int i=1;i<=n;i++)
	{
		int x,y;
		cin>>x>>y;
		y=abs(y);
		if(y>d)
		{
			cout<<"-1"<<endl;
			return 0;
		}
		b[i].l=x-sqrt(d*d-y*y);
		b[i].r=x+sqrt(d*d-y*y);
		vis[i]=false;
	}
	sort(b+1,b+1+n,cmp);
	for(int i=1;i<=n;i++)
	{
		if(!vis[i])
		{
			ans++;
			vis[i]=true;
			for(int j=i+1;j<=n;j++)
			{
				if(b[j].l<b[i].r)
				vis[j]=true;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}
posted @ 2019-08-10 09:50  wweiyi  阅读(120)  评论(0编辑  收藏  举报
js脚本