【luogu1325】雷达安装--贪心

题目描述

描述:

假设海岸线是一条无限延伸的直线。它的一侧是陆地,另一侧是海洋。每一座小岛是在海面上的一个点。雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d。你的任务是建立尽量少的雷达站,使所有小岛都在扫描范围之内。

数据使用笛卡尔坐标系,定义海岸线为x轴。在x轴上方为海洋,下方为陆地。

样例1如图所示

输入格式

第一行包括2个整数n和d,n是岛屿数目,d是雷达扫描范围。

接下来n行为岛屿坐标。

输出格式

一个整数表示最少需要的雷达数目,若不可能覆盖所有岛屿,输出“-1”。

输入输出样例

输入 #1
3 2
1 2
-3 1
2 1
输出 #1
2

说明/提示

数据范围

n1000,d20000

 xi2×10^6,0≤yi≤20000

  贪心,求出在海岸上的一段区间,能使该雷达被扫描到,得到若干个

区间,然后用最小的点把所有的区间覆盖。

代码:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
#define N 20000
using namespace std;
double tmp;
int ans,n,d,x[N],y[N];
struct node{
	double l,r;
}a[N];
double cmp(node a,node b){return a.r<b.r;}
int main()
{
	scanf("%d%d",&n,&d);
	for(int i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]);
	for(int i=1;i<=n;i++)
	{
		a[i].l=x[i]-sqrt(d*d-y[i]*y[i]);
		a[i].r=x[i]+sqrt(d*d-y[i]*y[i]);
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		if(i==1)tmp=a[i].r,ans++;
		else{
			if(tmp>a[i].l)continue;
			else tmp=a[i].r,ans++;
		}
	}
	printf("%d\n",ans);
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/yelir/p/11574832.html
今日推荐