POJ 1328 Radar Installation
题意: 海上有一些岛屿(数目为n),需要在岸边(x 轴)修建一些雷达站覆盖这些岛屿,雷达的覆盖范围是d , 求最少需要多少雷达。
思路:求出每个岛屿能被雷达覆盖的,雷达可以放置的最左边和最右边位置,然后将每个岛屿按照左边的位置排序,放置雷达。
10955167 | NY_lv10 | 1328 | Accepted | 300K | 47MS | C++ | 1092B | 2012-10-25 18:45:07 |
View Code
#include<iostream> #include<algorithm> #include<vector> #include<math.h> using namespace std; struct point{ int x,y; double l,r; }; vector<point> pt; int r,n; bool cmp(point p1,point p2) { return p1.l<p2.l; } int main() { int i,sum,cases=0; //double loc; point tmp; bool flags=false; while(cin>>n>>r&&n||r) { sum=0;flags=false;pt.clear(); for( i=0;i<n;i++) { cin>>tmp.x>>tmp.y; if(tmp.y>0) pt.push_back(tmp); if(tmp.y>r)flags=true; } if(flags||r<0) { cout<<"Case "<<++cases<<": -1"<<endl; continue; } for(i=0;i<pt.size();i++) { pt[i].l= pt[i].x- sqrt((double)r*r-pt[i].y*pt[i].y); pt[i].r= pt[i].x-pt[i].l+ pt[i].x; } sort(pt.begin(),pt.end(),cmp); i=0; while(i<pt.size()) { tmp=pt[i++]; sum++; while(i<pt.size()&&pt[i].l<=tmp.r&&tmp.l<=pt[i].l) //注意范围是不断的缩小的左右判断 { //tmp.l <=pt[i].l <= tmp.r tmp.l=pt[i].l; if(pt[i].r-tmp.r<1e-8) tmp.r=pt[i].r; i++; } } cout<<"Case "<<++cases<<": "<<sum<<endl; } return 0; }