思路:贪心。第一个卫星的位置在s1和e1之间,若s2<=e1则不需要新卫星,第一个卫星位置更新为s2和e2之间;若s2>e1则需要新卫星,第二个卫星位置在s2和e2之间。以此类推。
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
typedef pair<double,double> PII;
int n,i,ans;
double x,y,d,flag;
PII radar[1005];
bool cmp(PII a,PII b)
{
return a.first<b.first;
}
int main()
{
int k=0;
while(scanf("%d %lf",&n,&d) && !(n==0 && d==0)){
k++;
ans=1;
flag=0;
for(i=0;i<n;i++){
scanf("%lf %lf",&x,&y);
if(d<0 || y>d){
flag=1;
}
radar[i].first=x-sqrt(d*d-y*y);
radar[i].second=x+sqrt(d*d-y*y);
}
if(flag){
printf("Case %d: -1\n",k);
continue;
}
sort(radar,radar+n,cmp);
flag=radar[0].second;
for(i=1;i<n;i++){
PII p=radar[i];
if(flag<p.first){
flag=p.second;
ans++;
}
else if(flag>p.second) flag=p.second;
}
printf("Case %d: %d\n",k,ans);
}
return 0;
}