题意:告诉你一些鱼雷的位置,问至少需要多少雷达才能监测到所有的鱼雷,雷达只能放在x轴上
贪心思路:将鱼雷的位置映射到x轴上的一个区间,则题目就转化成求区间的最小覆盖点
区间按起点的x轴排序后开始贪心
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define Min(a,b) a<b?a:b
typedef struct{
double left;
double right;
}Region;
int comp(const void *a,const void *b){
if(((Region*)a)->left<((Region*)b)->left)
return -1;
return 1;
}
int main(){
int N,i,j,Case=1,Ans,flag;
double R,x,y,temp,l,r;
Region X[1001];
while(~scanf("%d %lf",&N,&R)){
if(N==0&&R==0)
break;
Ans=1;
flag=0;
for(i=0;i<N;i++){
scanf("%lf %lf",&x,&y);
if(y>R)
flag=1;
temp=sqrt(R*R-y*y);
X[i].left=x-temp;
X[i].right=x+temp;
}
if(flag){
printf("Case %d: -1\n",Case++);
continue;
}
qsort(X,N,sizeof(Region),comp);
l=X[0].left;
r=X[0].right;
for(i=1;i<N;i++){
if(X[i].left>r){
Ans++;
l=X[i].left;
r=X[i].right;
}
else{
l=X[i].left;
r=Min(r,X[i].right);
}
}
printf("Case %d: %d\n",Case++,Ans);
}
return 0;
}