POJ 1328 Radar Installation 贪心

题目大意: 假设有一条无限长的海岸线,海岸线以上部分有n个岛屿。在海岸线上有雷达,每个雷达能够探测的范围为半径为r的圆,当且仅当一个岛屿与雷达的距离小于等于r时,岛屿能被雷达探测到。给出所有岛屿的坐标和雷达的半径。求最少需要用多少个雷达,使得所有的岛屿都被探测到。

图中ABCD为海岛的位置。假设本题半径为2(符合坐标系),那么A点坐标为(1,1)以此类推。 在题中,记录每个点的坐标,,并把一个点新加一个标记变量以标记是否被访问过。

存储图中红色圆与X轴的交点。先排序,排序的准则是按红色圆与x轴左交点的先后顺序。 如图,如果B点圆(且如此称呼)的左交点(J1点)在A点圆右交点(E1)左侧,那么B点一定涵盖在A点圆内部。再如图,如果D点圆的左交点(图中未标示)在A点圆的右交点(未标示)右,则D点不在A点圆中。

;struct point{double left, right;}dp[1050];int sum;int cmp(point a, point b){return a.left<b.left;}void solve(int n){sort(dp, dp+n, cmp);sum=1;double std;std=dp[0].right;for(int i=1; i<n; ++i){if(dp[i].left>std){sum++;std=dp[i].right;}else if(dp[i].right<std){std=dp[i].right;}}}int main(){int n, r, x, y;int t=1;while(cin>>n>>r&&(n+r!=0)){int i, fail=0;for(i=0; i<n; i++){cin>>x>>y;if(y>r)fail=1;else{double l=sqrt ((double)(r*r-y*y));dp[i].left=x-l;dp[i].right=x+l;}}if(fail){sum=-1;cout<<“Case “<<t++<<“: “<<sum<<endl;}else{solve(n);cout<<“Case “<<t++<<“: “<<sum<<endl;}}}

人生伟业的建立 ,不在能知,乃在能行。

POJ 1328 Radar Installation 贪心

相关文章:

你感兴趣的文章:

标签云: