发布题解

raoyueyang  •  2年前


先看题目 :: 206011 - 雷达问题 如图6.4所示,雷达装在一条直线上,直线上方是海洋,海洋中的岛屿位置已知,每一个雷达的扫描范围是一个半径为d的圆形区域,问最少需要多少个雷达覆盖所有岛屿。

这道题其实很简单,就是需要知道一个公式 1.区间数组的计算:勾股定理,距离
dis=\sqrt{d^2-y^2}

最小值就是x-disx,最大值就是x+dis

2.用变量now记录目前可满足的最大x值。now初始为a[1].ra[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;
}

学废了吗??;


评论: