1、简单描述
一条海岸线,一边是海洋,一边是陆地,海洋上分布着许多小岛,海岸线上有许多雷达。至少要多少个雷达,将小岛完全覆盖
2、思路
#include<stdio.h>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
struct Line
{
double l,r;
}line[10001];
bool cmp(Line a,Line b)
{
return a.l<b.l;
}
int main()
{
int n,d;
int i;
int x,y;
bool yes;
int icase=1;
while(cin>>n>>d)
{
yes=true;
int cnt=0;
if(n==0&&d==0)break;
for(i=0;i<n;i++)
{
cin>>x>>y;
if(yes==false)continue;
if(y>d)yes=false;
else
{
line[i].l=(double)x-sqrt((double)d*d-y*y);
line[i].r=(double)x+sqrt((double)d*d-y*y);
}
}
if(yes==false)
{
cout<<"Case "<<icase++<<": -1"<<endl;
continue;
}
sort(line,line+n,cmp);
cnt++;
double now=line[0].r;
for(i=1;i<n;i++)
{
if(line[i].r<now)
now=line[i].r;
else if(now<line[i].l)
{
now=line[i].r;
cnt++;
}
}
cout<<"Case "<<icase++<<": "<<cnt<<endl;
}
return 0;
点为岛屿,那么能够覆盖到此岛屿的雷达所在的区间,就是以该岛屿为圆心的圆与x轴交点所在的区间。计算出所有岛屿所在区间。得到一个区间数组
将数组排序,重叠部分说明可共用一个雷达,同查找区间公共元素个数,贪心。