POJ 1328 Radar Installation 贪心

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

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

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

#include <iostream>
#include <cmath>
#include <algorithm>

using namespace std;

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;
        }
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/wanglaoda/p/4937152.html