算法学习之路|区间选点问题

一条海岸线,在海中有一些岛屿,要在岸上建一些雷达,每个雷达有一定的照射范围d,问至少要建造多少雷达才能覆盖所有岛屿
输入格式
输入有多组数据,第一行d,n为雷达半径和海岛个数,接下来n行每行两个数,是每个岛屿坐标,输入0 0结束

输出格式
输出雷达个数,无法覆盖就输出-1
输入样例:
3 2
1 2
-3 1
2 1
1 2
0 2
0 0
输出样例:
Case 1: 2
Case 2: 1
解题思路:把覆盖范围区间化,简化成区间选点问题,贪心,
思路不难,但是有一些坑。

#include<stdio.h>  
#include<stdlib.h>  
#include<math.h>   
struct island  
{  
    float left,right;  
}is[1010];  
int cmp(const void *a, const void *b)  
{  
    return (*(struct island*)a).left>(*(struct island*)b).left?1:-1;  
}  
int main()  
{  
    int n,d,num =1;  
    while(scanf("%d%d",&n,&d)!=EOF&&(n||d))  
    {  
        int x,y,flag=0;  
        for(int i=1;i<=n;i++)  
        {  
            scanf("%d%d",&x,&y);  
            if(y>d)  
            flag=1;  
            float dis;  
            dis=sqrt((float)(d*d-y*y));  
            is[i].left=(float)x-dis;  
            is[i].right=(float)x+dis;  
        }  
        qsort(is+1,n,sizeof(is[0]),cmp);  
        int sum=1;  
        float r;  
        r=is[1].right;  
        for(int i=2;i<=n;i++)  
        {  
            if(r>is[i].right)
            r=is[i].right;  
            else if(is[i].left>r) 
            {  
                sum++;  
                r=is[i].right;  
            }  
        }  
        if(flag)  
        printf("Case %d: -1\n",num++);  
        else  
        printf("Case %d: %d\n",num++,sum);  
    }  
    return 0;  
}   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值