标签:
/* 贪心.... 处理处每个点按照最大距离在x轴上的映射 然后我们就有了一些线段 目的是选取尽量少的点 使得每个线段内都有点出现 我们按照左端点排序 然后逐一处理 假设第一个雷达安在第一个线段的右端点 若下一条与之无交点 则再按一个雷达 若完全覆盖 贪心的 我们把雷达移动到下一条的右端点 这样这个雷达就又多覆盖了一个岛 */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define maxn 1010 using namespace std; int n,ans,cas; double d,x,y; struct node { double l,r; }p[maxn]; int cmp(const node &a,const node &b) { if(a.l==b.l)return a.r<b.r; return a.l<b.l; } int main() { while(1) { ans=1;int falg=0; scanf("%d%lf",&n,&d); if(n==0&&d==0)break; for(int i=1;i<=n;i++) { scanf("%lf%lf",&x,&y); if(y>d)falg=1; p[i].l=x-sqrt(d*d-y*y); p[i].r=x+sqrt(d*d-y*y); } if(falg){printf("Case %d: -1\n",++cas);continue; sort(p+1,p+1+n,cmp); double t=p[1].r; for(int i=2;i<=n;i++) { if(p[i].l>t) { ans++;t=p[i].r;continue; } if(p[i].r<=t) { t=p[i].r;continue; } if(p[i].r>t)continue; } printf("Case %d: %d\n",++cas,ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/yanlifneg/p/5648698.html