区间选点问题,坑点 一个是double类型,2是y > d|| d < 0要考虑到,3是要按照左端点进行升序排序,4是算法核心内容,如果选取的cou作为雷达位置,那么从下一个区间开始选点,如果下一个区间的右端点比小于等于cou,那么让cou = 这个区间的右端点,如果下一个区间的左端点大于cou,那么再重新安装一个雷达,让雷达安放在这个区间的右端点上。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <math.h>
using namespace std;
struct node
{
double u;
double v;
}a[1123];
bool cmp(node a, node b)
{
return a.u < b.u;
}
int main()
{
int n, d;
int i;
double x, y;
int count = 1;
while(cin >> n >> d){
if(n == 0 && d == 0)
break;
int flag = false;
for(i = 0;i < n;i++){
cin >> x >> y;
if(y > d || d < 0){
flag = true;
}
a[i].u = x-sqrt(d*d - y*y);
a[i].v = x+sqrt(d*d - y*y);
}
if(!flag){
int cnt;
double cou;
sort(a,a+n,cmp);
cnt = 1;
cou = a[0].v;
for(i = 1;i < n;i++){
if(a[i].v <= cou){
cou = a[i].v;
}else if(a[i].u > cou){
cnt++;
cou = a[i].v;
}
}
printf("Case %d: %d\n", count, cnt);
}else {
printf("Case %d: -1\n", count);
}
count++;
}
return 0;
}