摘要:贪心,把每个岛转成能覆盖他的雷达的区间。题目变成求最少的点使得每个区间内都有点。
贪心:去点包含其他区间的区间(这个代码里没去,而是例外处理)。使每个点尽可能的往右。
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int size = 1000;
typedef struct Interval{
double left;
double right;
}Interval;
Interval intervals[size];
bool compareIntervals(Interval one, Interval two)
{
if( fabs(one.left - two.left) < 0.000001 ){
return one.right > two.right;
}
return one.left < two.left;
}
int main()
{
int n, d;
int case_index = 1;
while( true ){
cin >> n >> d;
bool flag = true;
if( n == 0 ){
break;
}
if( d <= 0 ){
flag = false;
}
for(int i=0; i<n; i++){
int x, y;
cin >> x >> y;
if( y > d ){
flag = false;
}
if( flag ){
intervals[i].left = x-sqrt(d*d-y*y);
intervals[i].right = x+sqrt(d*d-y*y);
}
}
if( !flag ){
cout << "Case " << case_index++ << ": " << -1 << endl;
continue;
}
sort(intervals, intervals+n, compareIntervals);
double current_right = intervals[0].right;
int num = 1;
for(int i=1; i<n; i++){
if(intervals[i].right < current_right){
current_right = intervals[i].right;
continue;
}
if((intervals[i].left-current_right) > 0.000001){
num++;
current_right = intervals[i].right;
continue;
}
}
cout << "Case " << case_index++ << ": " << num << endl;
}
return 0;
}