【luogu1325】雷达安装--贪心
题目描述
描述:
假设海岸线是一条无限延伸的直线。它的一侧是陆地,另一侧是海洋。每一座小岛是在海面上的一个点。雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d。你的任务是建立尽量少的雷达站,使所有小岛都在扫描范围之内。
数据使用笛卡尔坐标系,定义海岸线为x轴。在x轴上方为海洋,下方为陆地。
样例1如图所示
输入格式
第一行包括2个整数n和d,n是岛屿数目,d是雷达扫描范围。
接下来n行为岛屿坐标。
输出格式
一个整数表示最少需要的雷达数目,若不可能覆盖所有岛屿,输出“-1”。
输入输出样例
输入 #1
3 2
1 2
-3 1
2 1
输出 #1
2
说明/提示
数据范围
n≤1000,d≤20000
∣xi∣≤2×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; }