题意:
有n个小岛,在x轴上方, 有一种雷达,覆盖范围为d,现在你可以在x轴以及x轴下方建立雷达,请问最少建立多个雷达可以覆盖所有的小岛
题解:
这是一道很经典的贪心入门题目, 从看到题意我们就知道 雷达建在x轴上是最优的,那么应该如何对这些小岛进行处理呢, 我们可以将每一个小岛的坐标信息来推出要覆盖到这个小岛的雷达, 要建在x轴上的哪些位置上,也就是一段区间,所以我们可以运用勾股定理,求出区间, 再对其进行排序,然后遍历一遍,贪心取最少的个数。做法如下:
AC_code:
/*
Algorithm: 贪心
Author: anthony1314
Creat Time:
Time Complexity:
*/
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<cstring>
#include<cstdio>
#include<cmath>
//#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define mod 1e9 + 7
#define line printf("--------------");
using namespace std;
struct ff {
double x, y;
} nn[1005];
struct node {
double fir, end;
} kk[1005];
bool cmp(node aa, node bb) {
if(aa.end == bb.end) {
return aa.fir > bb.fir;
}
return aa.end < bb.end;
}
int n, d;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int caaa = 1;
while(~scanf("%d %d", &n, &d)) {
if(n == 0 && d == 0){
break;
}
for(int i = 1; i <= n; i++) {
double a, b;
cin>>a>>b;
nn[i].x= a;
nn[i].y =b;
}
bool flag = true;
for(int i = 1; i <= n; i++) {
if(nn[i].y > d) {
flag = false;
break;
}
double a = nn[i].x;
double b = nn[i].y;
kk[i].fir = a - sqrt(d*d - b*b);
kk[i].end = a + sqrt(d*d - b*b);
}
int ans = 1;
if(!flag) {
ans = -1;
} else {
sort(kk+1, kk + n+1, cmp);
node tmp = kk[1];
for(int i = 2; i <= n; i++) {
if(kk[i].fir > tmp.end) {
tmp = kk[i];
ans++;
} else if(kk[i].end < tmp.end) {
tmp = kk[i];
}
}
}
cout<<"Case "<<caaa<<": "<<ans<<endl;
caaa++;
}
return 0;
}