贪心之区间覆盖问题(POJ 1328 Radar Installation)

原文:https://blog.csdn.net/ac_gibson/article/details/44410041

题目大意:海中有n个岛屿,现在想要在海岸线上装设雷达来探测这些岛屿(海岸线相当于x轴,岛屿都在x轴的上方),雷达的探测范围是一个半径为d的圆,已知n个岛屿的坐标,问你最少需要多少雷达才能探测到全部岛屿;如果不能探测到全部岛屿,输出“ -1 ”。
Sample Input
3 2
1 2
-3 1
2 1

1 2
0 2

0 0

Sample Output

2

1

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct date		//用来储存之后的左右坐标
{
    double l;
    double r;
}loc[100];
int cmp(const void*a,const void*b)
{
    return (*(date*)a).l-(*(date*)b).l;
}
int main()
{
    int n,d;
    while(scanf("%d %d",&n,&d))
    { 
        if(n==0&&d==0)break;
        int x[100],y[100];
        int i;
        for(i=0;i<n;i++)
        {
            scanf("%d %d",&x[i],&y[i]);
        }
        for(i=0;i<n;i++)
        {
            if(y[i]>d){printf("-1");return 0;}//y比d大则不可能存在雷达满足条件
            else
            {
                double t=sqrt(d*d-y[i]*y[i]);//此处思路是,当两个圆的弦有交点,
                loc[i].l=x[i]-t;			   则在交点区间内,都可做圆覆盖岛屿
                loc[i].r=x[i]+t;
            }
        }
        qsort(loc,n,sizeof(loc[0]),cmp);//按左端点排序
        int j=0;
        int num=1;
        for(i=1;i<n;i++)
        {
            if(loc[i].l>loc[j].r)//当两个圆不相交,多一个雷达
            {
                num++;
                j=i;
            }
            else if(loc[i].r<loc[j].r)//当第二个圆的弦被包含在第一个圆,
            {							则取第二个圆的右端点(取比较小的一个圆的范围)
                j=i;					因为我们要是雷达覆盖两个圆
            }
        }
        printf("%d",num);
        return 0;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值