题目地址:http://poj.org/problem?id=1328

题目大意:

题意:多组数据输入,每组数据第一行给出N,R接着有N组小岛坐标,雷达半径为R。X轴以上是海洋,X轴以下是陆地,雷达只能部署到X轴上,输出覆盖海洋上N个小岛最少需要多少雷达,如果不能完全覆盖,输出-1;

思路:假设雷达在小岛上,那么雷达覆盖范围和X轴就有相交区间,记录下这个区间的左右极限,接着就是区间覆盖问题,有重叠区间的部分只要一个雷达就够了,如果发现有雷达覆盖范围不和X轴相交,那就输出-1
POJ1328 Radar Installation(区间贪心)

源代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn = 1005;
struct pos//记录小岛雷达站覆盖的区间
{
    double left,right;
} p[maxn];
bool cmp(pos a, pos b)
{

    if(a.right==b.right)
        return a.left < b.left;
    return a.right <b.right;
}
int main()
{
    int n,d;int Case  = 1;
    while(~scanf("%d %d",&n,&d))
    {

        if(n==0&&d==0)
            break;
            int flag = 0;
            for(int i = 0 ; i < n; i++)
            {
                int px,py;
                scanf("%d %d",&px,&py);
                if(py>d)
                {
                    flag = 1;
                }
                p[i].left = px - sqrt(d*d-py*py);
                p[i].right = px + sqrt(d*d-py*py);
            }
            if(flag == 1)
            {
                printf("Case %d: -1\n",Case++);
                continue;
            }
            sort(p,p+n,cmp);
            int result = 1;
            double rt = p[0].right;
            for(int i = 0 ; i < n; i ++)
            {
                if(p[i].left>rt)
                {
                    result++;
                    rt = p[i].right;
                }

            }
        printf("Case %d: %d\n",Case++,result);

    }



    return 0;
}

提供测试数据:

https://pasteme.cn/7639

相关文章: