首页 > 代码库 > luogu P1325 雷达安装
luogu P1325 雷达安装
题目描述
描述:
假设海岸线是一条无限延伸的直线。它的一侧是陆地,另一侧是海洋。每一座小岛是在海面上的一个点。雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d。你的任务是建立尽量少的雷达站,使所有小岛都在扫描范围之内。
数据使用笛卡尔坐标系,定义海岸线为x轴。在x轴上方为海洋,下方为陆地。
样例1如图所示
输入输出格式
输入格式:
第一行包括2个整数n和d,n是岛屿数目,d是雷达扫描范围。
接下来n行为岛屿坐标。
输出格式:
一个整数表示最少需要的雷达数目,若不可能覆盖所有岛屿,输出“-1”。
输入输出样例
输入样例#1:
3 21 2-3 12 1
输出样例#1:
2
贪心,把问题转化成岛屿覆盖的区域必须有雷达,之后类似于活动安排问题
#include<cstdio>#include<cmath>#include<iostream>#include<algorithm>using namespace std;#define N 1005int n,d;struct island{ int x;int y;}is[N];struct miku{ double l,r; bool operator < (const miku & a)const{ return r < a.r; }}cd[N];double calc(double x){ return sqrt(1.0*d*d-x*x);}bool vis[N];int main(){ cin>>n>>d; for(int i=1;i<=n;i++) { cin>>is[i].x>>is[i].y; if(is[i].y>d||d<0){cout<<"-1"<<endl;return 0;} } for(int i=1;i<=n;i++) { double len=calc(is[i].y); cd[i].l=is[i].x-len; cd[i].r=is[i].x+len; } sort(cd+1,cd+n+1); int ans=0; for(int i=1;i<=n;i++) { if(!vis[i]) { vis[i]=1; for(int j=1;j<=n;j++) { if(!vis[j] && cd[j].l<=cd[i].r) vis[j]=1; } ans++; } } cout<<ans<<endl; return 0;}
luogu P1325 雷达安装
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。