博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法学习之路|区间选点问题
阅读量:6291 次
发布时间:2019-06-22

本文共 1333 字,大约阅读时间需要 4 分钟。

一条海岸线,在海中有一些岛屿,要在岸上建一些雷达,每个雷达有一定的照射范围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
#include
#include
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; }

转载地址:http://nfjta.baihongyu.com/

你可能感兴趣的文章
Android 6.0指纹识别App开发案例
查看>>
正文提取算法
查看>>
轻松学PHP
查看>>
Linux中的网络监控命令
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>
Enumberable
查看>>
开发者论坛一周精粹(第五十四期) 求购备案服务号1枚!
查看>>
validate表单验证及自定义方法
查看>>