poj 1328 雷达覆盖 贪心
题目:
Figure A Sample Input of Radar Installations
题意:
在x轴上某些位置装雷达,问怎么才能使海岛p被信号覆盖,有n个海岛,雷达覆盖范围是d。
分析:
考虑一个海岛p,对于覆盖它的雷达放的最优的位置是它在圆圈的边缘上,因为这样这个雷达就可以覆盖更多其他的海岛。那么先按x排序,对于当前的一个圈,看看是否下一个海岛是否可以在圈内,如果可以就在看下一个,不可以就放一个最新的雷达,接下来在比较后面的海盗是否可以放到这个圈内。
需要注意一种情况,就是对于第i个海岛放的雷达不可以覆盖第i+1个海岛,而第i+1个海岛放的雷达可以覆盖第i个海岛的情况,这种情况,雷达要放在可以覆盖第i+1个海岛的那个位置了。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N=1009; int d,n; struct point { int x,y; }; point p[N]; bool cmp(const point& a,const point& b){return a.x<b.x;} double getx(point a){ return a.x+sqrt(1.0*d*d-1.0*a.y*a.y); } int main() { int cas=0; while(~scanf("%d%d",&n,&d)&&(n+d)){ bool flag=0; for(int i=0;i<n;i++){ scanf("%d%d",&p[i].x,&p[i].y); if(p[i].y>d)flag=1; } if(flag){ printf("Case %d: -1\n",++cas);continue; } sort(p,p+n,cmp); double x=getx(p[0]); int ans=1; for(int i=1;i<n;i++){ double tmp=getx(p[i]); if(p[i].x<x&&x>tmp){ x=tmp;continue; } if(p[i].y*p[i].y+(p[i].x-x)*(p[i].x-x)<=d*d)continue; //if(p[i].y*p[i].y+(p[i].x-x)*(p[i].x-x)<=d*d)continue; x = getx(p[i]); ans++; } printf("Case %d: %d\n",++cas,ans); } return 0; }