POJ1328 Radar Installation
题目链接:
POJ1328 Radar Installation
简单理解一下题目:
张三所在的地方有一个无限延伸的海岸线,如图所示(图源自题目),

x轴上方是海,下方是陆地,海上有一些分散的小岛,张三为了保证每一个小岛都在监测范围内,要在海岸线上放一些雷达,每个雷达的探测范围是直径为d的圆形区域,由于张三比较抠,他想尽可能用比较少的雷达来探测所有的小岛,那么在给定小岛个数n、位置以及探测范围d的情况下,请你算出最少的雷达数,如果无法保证所有小岛都探测到就输出-1。
简单分析:
这个题我一开始的算法是把每个小岛按照横坐标从左至右来排序,然后从最左边的小岛开始,以小岛为圆心画圆,与x轴的右交点作为雷达的位置,因为我想着雷达放在越靠右的位置就越能覆盖右侧的小岛,如果下一个小岛不在上一个小岛的圆圈内就重新设置一个雷达。但是这个方案WA了,试了好半天都不知道为啥错了。后来看到Discuss里面大佬提供的样例,在纸上画了一下就发现了问题所在,如图,例如样例是A(-5,3),B(-3,5)这两个点,按照上述算法,这两个点需要两个雷达,分别是C(-1,0)和D(-3,0),因为如果在A距离最远的地方C设置雷达,由于B点纵坐标太高,不在该范围内,如果把第一步的雷达往左一点,放在D就可以覆盖两座小岛。

然后换了一个思路,对每一个小岛求出以其为圆心的圆与x轴的左交点和右交点,然后按照左交点排序,这样比较的时候就不会发生上述思路中排序在后面的小岛对应的雷达位置比前面小岛还靠前的问题,然后如果某一小岛圆圈左交点在前一个小岛的右交点左边,那么该小岛不必新设置一个雷达。
AC代码:(样例来自于Discuss中的大佬,如果都过了基本就对了,正确输出也在最后)
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const int MAX_N = 100000;
int n, d;
int index = 1;
struct node {
double x, y

最低0.47元/天 解锁文章
2211





