raoyueyang • 2年前
先看题目 :: 206011 - 雷达问题 如图6.4所示,雷达装在一条直线上,直线上方是海洋,海洋中的岛屿位置已知,每一个雷达的扫描范围是一个半径为d的圆形区域,问最少需要多少个雷达覆盖所有岛屿。
这道题其实很简单,就是需要知道一个公式
1.区间数组的计算:勾股定理,距离
dis=\sqrt{d^2-y^2}
最小值就是x-disx,最大值就是x+dis
2.用变量now记录目前可满足的最大x值。now初始为a[1].r当a[i].l>now时,说明目前的雷达不够了,需要再添雷达即ans++
3 还有一个小小的细节,就是因为雷达是装在海岸上的,假如都已经超出了这个的最远的范围,直接输出-1;
#include<bits/stdc++.h>
using namespace std;
int n,d,ans,cnt=1,flag=0;
struct ryy
{
double x,y;
bool vis=0;
} a[1005];
bool cmp(ryy p,ryy q)//排序
{
return p.y<q.y;
}
int main()
{
while(cin>>n>>d)
{
if(n==0 && d==0)//有多组测试数据
break;
for(int i=0; i<n; i++)
{
double p,q,m;
cin>>p>>q;
if(q>d)
{
flag=1;
}
m=sqrt(d*d-q*q);距离
a[i].x=p-m,a[i].y=p+m;
}
sort(a,a+n,cmp);
for(int i=0; i<n; i++)
{
if(a[i].vis)
continue;
ans++;
a[i].vis=1;
for(int j=0; j<n; j++)
if(!a[j].vis&&a[i].y>=a[j].x)
a[j].vis=1;
}
if(flag)
cout << "-1" << endl;
else
cout << ans << endl;
memset(a,0,sizeof(a));
flag=n=d=ans=0;
}
return 0;
}
学废了吗??;
评论: