POJ 1328 Radar Installation
http://poj.org/problem?id=1328
题目大意:在直角坐标系中有N个点 用半径为R 圆心在X轴上的圆去覆盖这些点 求最小需要的圆的个数
解题思路:如果有点的走坐标大于R那么必然有点无法覆盖 输出-1
对所有的点求能覆盖这个点的圆的圆心坐标在X轴上的左右极限 题目就被转化为求在N个区间中 用最少的点使得每个区间内最少有一个点
首先 对所有区间的按照左端点进行升序排列 如果一个区间的左端点大于当前的点 那么新建一个点在这个区间的右端点
如果一个区间的左端点小于等于当前的点 那么当前的点变成这个区间的右端点和当前点中比较小的点
#include<stdio.h> #include<math.h> #include<algorithm> using namespace std; struct Node { double x,y; double l,r; }node[1001]; bool cmp(Node x,Node y) { return x.l<y.l; } int main() { int n,i,k,t=1,num; double d; double a; while(scanf("%d %lf",&n,&d)!=EOF) { if(n==0) break; for(i=1;i<=n;i++) scanf("%lf %lf",&node[i].x,&node[i].y); k=0; for(i=1;i<=n;i++) { if(node[i].y>d) { k=1; printf("Case %d: -1\n",t++); break; } } if(k==0) { for(i=1;i<=n;i++) { node[i].l=(double)(node[i].x-(double)sqrt(d*d-node[i].y*node[i].y)); node[i].r=(double)(node[i].x+(double)sqrt(d*d-node[i].y*node[i].y)); } sort(node+1,node+1+n,cmp); a=node[1].r; num=1; for(i=2;i<=n;i++) { if(a<node[i].l) { num++; a=node[i].r; } else a=min(node[i].r,a); } printf("Case %d: %d\n",t++,num); } } return 0; }