题意:给定海岛个数、雷达半径以及各海岛坐标,求能覆盖所有海岛的最小雷达数。
思路:先对每个海岛求一个区间:即能覆盖它的所有雷达的圆心所构成的区间。然后对区间排序,定义一个最右点over,依次延伸over,如果over不在某个区间内,那么消耗一颗雷达,over更新为该区间的最右端,否则end更新为起点在over内的所有区间的最小右端点。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <vector> #include <algorithm> #include <set> #include <map> #include <bitset> #include <cmath> #include <queue> #include <stack> using namespace std; const int maxn=1010; typedef struct P { double start,over; }P; P point[maxn]; bool cmp(P a,P b) { return a.start<b.start; } int main() { int n; double r; int cas=0; while(cin>>n>>r) { if(n==0&&r==0) break; int res=0; for(int i=0;i<n;i++) { double x,y; cin>>x>>y; if(res==-1) continue; if(y>r){ res=-1; continue; } double tt=sqrt(r*r-y*y); point[i].start=x-tt; point[i].over=x+tt; } if(res==-1) { cout << "Case " << ++cas<< ": " << res << endl; continue; } sort(point,point+n,cmp); double mi=-0x3ffff; for(int i=0;i<n;i++) { if(mi<point[i].start){ res++; mi=point[i].over; } else if(mi>point[i].over){ mi=point[i].over; } } cout << "Case " << ++cas<< ": " << res << endl; } return 0; }