思路:
思路:利用贪心算法
从左往右安雷达,每次都将雷达安在所能安的位置中的最右边的位置
根据题意,该位置为以未被雷达覆盖的岛屿为圆心的圆与海岸线的交点中的第一个右交点
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>
#include<iostream>
#include<map>
#include<set>
#include<math.h>
using namespace std;
#define MAX_A 10000
//思路:利用贪心算法
//从左往右按雷达,每次都将雷达安在所能安的位置中的最右边的位置
//根据题意,该点为以未被雷达覆盖的岛屿为圆心的圆与海岸线的交点中的第一个右交点
typedef pair<double,double> section;//以岛屿为圆心的圆与海岸线相交的两点
//比较函数,用于排序
int cmp(section a,section b){
return a.second<b.second;
}
int main(){
//输入
int n,d;
scanf("%d %d",&n,&d);
int kase = 1;
while(n!=0||d!=0){
int sucess = 1;
section secs[n];
for(int i=0;i<n;i++){
int x,y;
scanf("%d %d",&x,&y);
double l = (double)d*d-y*y;
if(fabs(y)>d){//把条件改为l<0答案错误,是因为浮点数计算的误差吗?
sucess = 0;
}else{
double b = sqrt(l);
secs[i].first = x-b;
secs[i].second = x+b;
}
}
if(sucess==1){
//按照右交点x坐标从小到大的顺序排列
sort(secs,secs+n,cmp);
//开始遍历
int num = 0;//雷达的数量
int sign[n];//标记数组,用来标记已经被雷达覆盖的岛屿
for(int i=0;i<n;i++){
sign[i] = 0;
}
for(int i=0;i<n;i++){
if(sign[i] == 0){
sign[i] = 1;
double loc = secs[i].second;
num++;
//将雷达覆盖的其他岛屿也标记
for(int j=i+1;j<n;j++){
if(loc>=secs[j].first){
sign[j] = 1;
}
}
}
}
printf("Case %d: %d\n",kase,num);
}else{
printf("Case %d: -1\n",kase);
}
kase++;
scanf("%d %d",&n,&d);
}
return 0;
}