这个题看起来很吓人,实际上呢,确实很吓人,他的意思是说给你小岛的坐标和岸边上雷达的扫描半径,给你几个小岛,让你求出最少需要多少雷达,如果不可能实现雷达的扫描范围覆盖小岛就输出“-1”,你可以想象一下,当小岛离海岸挺远,雷达半径很近的时候这是不可能的,剩下的就是如何让雷达的数目最小了,别人说是个贪心。。我觉得就是个纯数学问题,你画画图就可以了
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
double x[10000],y[10000],ll[11000],rr[10000];
int main()
{
int n,d;
int count=1;
while(cin>>n>>d)
{
if(n==0&&d==0)
break;
int flog=1,sum=1;
for(int i=0;i<n;i++)
{
cin>>x[i]>>y[i];
if(y[i]>d)
flog=0;
}
cout<<"Case "<<count;
count++;
if(flog==0||d==0)
{
cout<<": -1"<<endl;
continue;
}
int t;
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(x[j]>x[j+1])
{
t=x[j];
x[j]=x[j+1];
x[j+1]=t;
t=y[j];
y[j]=y[j+1];
y[j+1]=t;
}
}
}
for (int i=0;i<n;i++)
{
double s=sqrt(d*d-y[i]*y[i]);
ll[i]=x[i]-s;
rr[i]=x[i]+s;
}
double x=rr[0];
for(int i=1;i<n;i++)
{
if(ll[i]>x)
{
x=rr[i];
sum++;
}
if(rr[i]<x)
{
x=rr[i];
}
}
cout<<": "<<sum<<endl;;
}
return 0;
}