假设海岸线是一条无限延伸的直线,它的一侧是陆地,另一侧是海洋,每一座小岛是在海面上的一个点。
雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d(半径)。你的任务是建立尽量少的雷达站,使所有小岛都在扫描范围之内。
数据使用笛卡尔坐标系,定义海岸线为x轴。在x轴上方为海洋,下方为陆地。
样例1如图所示
第一行包括2个整数n和d,n是岛屿数目,d是雷达扫描范围。
接下来n行为岛屿坐标。
一个整数表示最少需要的雷达数目,若不可能覆盖所有岛屿,输出“-1”。
3 2 1 2 -3 1 2 1
2
n≤1000, d≤20000
∣xi∣≤2×10^6 , 0≤yi≤20000
代码如下:
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int n,d,ans = 0; int v[1003]; struct node{ int l,r; }a[1003]; bool cmp(node x,node y) { return x.r < y.r; } int main() { scanf("%d%d",&n,&d); for(int i = 1;i <= n;i++) { int x,y; scanf("%d%d",&x,&y); a[i].l = x - sqrt(d*d - y*y); a[i].r = x + sqrt(d*d - y*y); if(y > d){ printf("-1"); exit(0); } } sort(a + 1,a + n + 1,cmp); int q = -9999999; for(int i = 1;i <= n;i++) { if(q < a[i].l) { ans++; q = a[i].r; } } printf("%d",ans); return 0; }