题目意思:有n个小岛,所有小岛要被半径为d的雷达覆盖,问最少需要多少雷达
排序+贪心
如果有一个小岛的纵坐标大于雷达半径,肯定不能覆盖;
这道题可以从小岛的角度来思考问题,先求出每个小岛的可设雷达区间,在这些区间选点,保证每个区间都有点。
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <list>
#define LL long long
#define INF 0x7fffffff
#define FIN 0x80000000
using namespace std;
struct island
{
double le,ri;
};
island data[1002];
bool cmd(island a,island b)
{
if(a.ri==b.ri) return a.le>b.le;
return a.ri<b.ri;
}
int main()
{
int n,d,cas=0;
while(scanf("%d %d",&n,&d),n||d)
{
int x,y,flag=0;
for(int i=0;i<n;i++)
{
scanf("%d %d",&x,&y);
if(flag) continue;
if(y>d) { flag=1; continue; }
double t=sqrt((double)d*d-y*y);
data[i].le=x-t;
data[i].ri=x+t;
}
if(flag)
{
printf("Case %d: -1\n",++cas);
continue;
}
sort(data,data+n,cmd);
// for(int i=0;i<n;i++)
// printf("%d %d##\n",data[i].le,data[i].ri);
int cnt=1;
double k=data[0].ri;
for(int i=1;i<n;i++)
{
while(i<n&&data[i].le<=k) i++;
if(i>=n) break;
cnt++;
k=data[i].ri;
}
printf("Case %d: %d\n",++cas,cnt);
}
}