雷达设备 贪心 区间 经典问题
假设海岸是一条无限长的直线,陆地位于海岸的一侧,海洋位于另外一侧。
每个小岛都位于海洋一侧的某个点上。
雷达装置均位于海岸线上,且雷达的监测范围为 d,当小岛与某雷达的距离不超过 d 时,该小岛可以被雷达覆盖。
我们使用笛卡尔坐标系,定义海岸线为 x 轴,海的一侧在 x 轴上方,陆地一侧在 x 轴下方。
现在给出每个小岛的具体坐标以及雷达的检测范围,请你求出能够使所有小岛都被雷达覆盖所需的最小雷达数目。
输入格式
第一行输入两个整数 n 和 d,分别代表小岛数目和雷达检测范围。
接下来 n 行,每行输入两个整数,分别代表小岛的 x,y 轴坐标。
同一行数据之间用空格隔开。
输出格式
输出一个整数,代表所需的最小雷达数目,若没有解决方案则所需数目输出 −1。
数据范围
1≤n≤1000,
−1000≤x,y≤1000
输入样例:
3 2
1 2
-3 1
2 1
输出样例:
2
import java.util.*;
public class Main
{
static int n,N=10005,d;
static class segment
{
double l,r;
public segment(double a,double b)
{
l=a;r=b;
}
}
static segment seg[]=new segment[N];
static class mcomp implements Comparator<segment>
{
public int compare(segment a,segment b)
{
if(a.r<b.r)return -1;
else return 1;
}
}
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
d=sc.nextInt();
boolean failed=false;
int p=0;
for(int i=0;i<n;++i)
{
int a,b;
a=sc.nextInt();
b=sc.nextInt();
if(b>d)failed=true;
else
{
double t=Math.sqrt(d*d-b*b);
seg[p++]=new segment(a-t,a+t);
}
}
if(failed)System.out.println(-1);
else
{
Arrays.sort(seg,0,p,new mcomp());
int cnt=0;double last=-1e20;
for(int i=0;i<p;++i)
{
if(last<seg[i].l)
{
cnt++;
last=seg[i].r;
}
}
System.out.println(cnt);
}
}
}