雷达设备(贪心)

 分析:首先给出一个小岛位置,我们能求出来这个雷达可以安放的位置区间,意思就是只要把这个雷达安放在这个区间,那么该小岛就能够被雷达覆盖,一共有n个小岛,那么相应的也能够求出来n个区间,这个时候每个区间内部至少需要有一个雷达,但是由于区间与区间之间可能是有重合 的,也就是说我们要求最少的雷达数目使得每个区间至少有一个雷达,那这显然就是一个贪心问题了,我们先把求出来的所有区间按照右端点排序,然后我们记录一个r代表上一个雷达安放的位置,假如当前区间在r的右边,那我们至少要再安放一个雷达,因为已经不存在在当前区间左边且没有被覆盖的小岛了,所以我们这个雷达安放在尽量靠右的位置,但是也要在当前区间内,所以就安放在当前区间的右端点上,依次安放,每次安放一个雷达就把雷达数目加1,最后输出雷达数目即可。

下面是代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
const int N=1003;
int n,d;
struct node{
	double l,r;
}p[N];
bool cmp(node a,node b)
{
	return a.r<b.r;
}
void f(int i,int x,int y)
{
	p[i]={x-sqrt(1.0*d*d-y*y),x+sqrt(1.0*d*d-y*y)};
}
int main()
{
	cin>>n>>d;
	int x,y;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&x,&y);
		if(y>d)
		{
			puts("-1");
			return 0;
		}
		f(i,x,y);
	}
	sort(p+1,p+n+1,cmp);
	double r=-9999;
	int cnt=0;
	for(int i=1;i<=n;i++)
	{
		if(p[i].l>r)
		{
			r=p[i].r;
			cnt++;
		} 
	}
	printf("%d",cnt);
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值