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

简介: 一条海岸线,在海中有一些岛屿,要在岸上建一些雷达,每个雷达有一定的照射范围d,问至少要建造多少雷达才能覆盖所有岛屿

一条海岸线,在海中有一些岛屿,要在岸上建一些雷达,每个雷达有一定的照射范围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;  
}   
目录
相关文章
|
2月前
|
机器学习/深度学习 数据采集 搜索推荐
Paper Digest | 突破个性化推荐数据稀疏性:长尾增强的图对比学习算法研究
本文提出了一种新的长尾增强的图对比学习方法(LAGCL),该方法促使模型同时兼顾头部节点与尾部节点之间的知识,并通过长尾增强技术来使模型产出更均匀更准确的节点表征,从而改进基于 GNN 的推荐任务。
|
2月前
|
算法 网络协议 Linux
【Cisco Packet Tracer】交换机的自学习算法
【Cisco Packet Tracer】交换机的自学习算法
53 0
|
3月前
|
算法 测试技术 C#
C++二分查找算法:包含每个查询的最小区间
C++二分查找算法:包含每个查询的最小区间
|
3月前
|
算法 安全 数据安全/隐私保护
C/C++学习 -- RSA算法
C/C++学习 -- RSA算法
30 0
|
2月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
16 0
|
3月前
|
机器学习/深度学习 算法
机器学习 - [集成学习]Bagging算法的编程实现
机器学习 - [集成学习]Bagging算法的编程实现
32 1
|
2天前
|
机器学习/深度学习 算法 前端开发
Scikit-learn进阶:探索集成学习算法
【4月更文挑战第17天】本文介绍了Scikit-learn中的集成学习算法,包括Bagging(如RandomForest)、Boosting(AdaBoost、GradientBoosting)和Stacking。通过结合多个学习器,集成学习能提高模型性能,减少偏差和方差。文中展示了如何使用Scikit-learn实现这些算法,并提供示例代码,帮助读者理解和应用集成学习提升模型预测准确性。
|
2天前
|
机器学习/深度学习 算法 Python
使用Python实现集成学习算法:Bagging与Boosting
使用Python实现集成学习算法:Bagging与Boosting
15 0
|
1月前
|
Rust Dart 算法
55.3k star!开源算法教程,附带动画图解,学习算法不再苦恼!
55.3k star!开源算法教程,附带动画图解,学习算法不再苦恼!
|
1月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法