/*
建雷达站
海岸线上建雷达站 覆盖所有的岛屿 最少的雷达站数目
思路:
倒过来想,在岛屿上看距离d是否与x轴有交点,得到交点的区间
再得到最少的区间数目
*/
#include<stdio.h>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN = 1000+10;
//覆盖范围与x轴的区间
struct Interval{
double left;
double right;
};
bool Compare(Interval a, Interval b){
return a.left < b.left;
}
Interval arr[MAXN];
int main(){
int n,d;
scanf("%d%d",&n,&d);
if(n == 0 && d == 0)
return 1;
bool flag = true;//是否可以全部安装
for(int i = 0;i < n; ++i){
int x,y;//岛屿的坐标
scanf("%d%d",&x,&y);
if(y > d){
flag = false;
}
else{
arr[i].left = x - sqrt(1.0 * d * d - 1.0 * y * y);
arr[i].right = x + sqrt(1.0 * d * d - 1.0 * y * y);
}
}
if(flag == false){
printf("NO!");
}
else{
sort(arr,arr+n,Compare);//按照区间左端点的大小排序
double current = arr[0].right;
int sum = 1;
for(int i = 1;i < n; ++i){
if(arr[i].left <= current){
current = min(current,arr[i].right);
}
else{
current = arr[i].right;
sum++;
}
}
printf("%d",sum);
}
return 0;
}
贪心算法——建雷达站
最新推荐文章于 2022-01-03 03:33:44 发布