雷达设备 贪心 区间 经典问题

假设海岸是一条无限长的直线,陆地位于海岸的一侧,海洋位于另外一侧。

每个小岛都位于海洋一侧的某个点上。

雷达装置均位于海岸线上,且雷达的监测范围为 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);
		}
	}
}
posted @ 2022-11-17 23:03  林动  阅读(30)  评论(0编辑  收藏  举报