题目大意:在y轴正方向有n个岛屿(n <=1000),在x轴上建立雷达,其覆盖范围是d,求最少建立多少个雷达。
题解:贪心,每个岛屿在[l,r]范围内建立雷达即可覆盖,那么我们有n个区间,我们按照r排序,第一个在r处建立,从左往右扫描,依次建立,如果没被覆盖过,就在r处建雷达(在r总比在l优),复杂度。
#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; }