https://vjudge.net/contest/426531#problem/C
反向考虑问题
在海岸边安置雷达,外面分布小岛,给出雷达可扫描的半径,和各个小岛的坐标,如果几个小岛在同一范围内,安置一个即可,请问至少需要几个雷达。
利用反向思维,岸边扫描小岛和小岛扫描岸边是同一问题,所以利用小岛所需要的范围,判断相邻的小岛之间是否可以用同一个。
写题的时候一定注意细节问题!!
这个题因为范围、类型转换、限制条件等问题提交了好几回。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct dao
{
double a,b;
}d[1005];
bool cmp(dao x,dao y)
{
return x.a<y.a;
}
int main()
{
int n,l,r=0;
while(cin >> n>>l)
{
if(n==0&&l==0) break;
r++;
int x,y,sum=1,p=0;
double t,q;
for(int i=0;i<n;i++)
{
cin >>x>>y;
if(abs(y)>l) p=1;
t=sqrt(double(l*l-y*y));
d[i].a=double(x)-t;
d[i].b=double(x)+t;
}
if(p==1) {cout << "Case " <<r<<": "<< -1<<endl;continue;}
sort(d,d+n,cmp);
q=d[0].b;
for(int i=1;i<n;i++)
{
if(q>=d[i].b) q=d[i].b;
else if(q<d[i].a)
{
sum++;
q=d[i].b;
}
}
cout << "Case " <<r<<": "<<sum<< endl;
}
return 0;
}