poj1328——Radar Installation

本文介绍了一种使用贪心算法解决雷达覆盖岛屿问题的方法。通过计算每个岛屿上雷达的有效覆盖范围,确保最少数量的雷达能覆盖所有岛屿。算法首先确定每个雷达的覆盖区间,然后采用贪心策略选择雷达,使它们能够覆盖尽可能多的岛屿。

贪心算法。

策略:先用d和岛屿坐标求出每个岛屿对应的雷达在x轴上的区间。利用贪心,使得求出的雷达落在尽可能多的区间里。

#include<iostream> #include<string> #include<cstdio> #include<algorithm> #include<math.h> using namespace std; #define N 1005 double a[N][2]; int n; double d; class point { public: double lx,rx; }; point p[N]; double cmp(point x,point y) { if(x.lx <=y.lx ) return true; return false; } void solve() { int i,j; for(i=0;i<n;i++) { p[i].lx =a[i][0]-sqrt(d*d-a[i][1]*a[i][1]); p[i].rx =a[i][0]+sqrt(d*d-a[i][1]*a[i][1]); } sort(p,p+n,cmp); int sum=1; double std=p[0].rx ; for(i=1;i<n;i++) { if(p[i].lx >std) { std=p[i].rx ; sum++; } else { if(p[i].rx <std) std=p[i].rx ; } } cout<<sum<<endl; } int main() { int i,ca=0; bool flag; while(cin>>n>>d) { if(n==0&&d==0) break; flag=true; for(i=0;i<n;i++) { cin>>a[i][0]>>a[i][1]; if(a[i][1]>d||d<=0) flag=false; } printf("Case %d: ",++ca); if(flag==false) cout<<-1<<endl; else solve(); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值