题目大意:在y轴正方向有n个岛屿(n <=1000),在x轴上建立雷达,其覆盖范围是d,求最少建立多少个雷达。
题解:贪心,每个岛屿在[l,r]范围内建立雷达即可覆盖,那么我们有n个区间,我们按照r排序,第一个在r处建立,从左往右扫描,依次建立,如果没被覆盖过,就在r处建雷达(在r总比在l优),复杂度
O(n2)
。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 1005
using namespace std;
struct A{
double l,r;
bool operator <(const A &t){
return r<t.r;
}
}a[N];
bool vis[N],fl;
int n,cnt,k;
double d,x,y;
int main(){
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
for(;scanf("%d%lf",&n,&d)&&n&&d;){
cnt=0;fl=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
scanf("%lf%lf",&x,&y);
if(y>d){
printf("Case %d: -1\n",++k);
fl=1;break;
}
a[i].l=x-sqrt(d*d-y*y);
a[i].r=x+sqrt(d*d-y*y);
}
if(fl) continue;
sort(a+1,a+1+n);
//for(int i=1;i<=n;i++) printf("%lf %lf\n",a[i].l,a[i].r);
for(int i=1;i<=n;i++){
if(!vis[i]){
cnt++;
vis[i]=1;
for(int j=i;j<=n;j++)
if(a[j].l<=a[i].r) vis[j]=1;
}
}
printf("Case %d: %d\n",++k,cnt);
}
return 0;
}