雷達設備
題目
假設海岸是一條無限長的直線,陸地位於海岸的一側,海洋位於另外一側。
每個小島都位于海洋一側的某個點上。
雷達裝置均位於海岸線上,且雷達的監測範圍爲d,當小島與某雷達的距離不超過d時,該小島可以被雷達覆蓋。
我們使用笛卡爾座標系,定義海岸線爲x軸,海的一側在x軸上方,陸地一側在x軸下方。
現在給出每個小島的具體座標以及雷達的檢測範圍,請你求出能夠使所有小島都被雷達覆蓋所需的最小雷達數目。
輸入格式
第一行輸入兩個整數n和d,分別代表小島數目和雷達檢測範圍。
接下來n行,每行輸入兩個整數,分別代表小島的x,y軸座標。
同一行數據之間用空格隔開。
輸出格式
輸出一個整數,代表所需的最小雷達數目,若沒有解決方案則所需數目輸出“-1”。
數據範圍
輸入樣例
3 2
1 2
-3 1
2 1
輸出樣例
2
題解
思路
- 本題可以轉化爲區間貪心問題
- 具體解法見:AcWing 112. 雷達設備
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 1010;
int n, d, cnt;
pair<double, double> a[N];
bool cmp(pair<double, double> &a, pair<double, double> &b) {
return a.second < b.second;
}
int main () {
cin >> n >> d;
int x, y;
bool fail = false;
for (int i = 0; i < n; i ++) {
cin >> x >> y;
if (y > d) {
fail = true;
}
else {
double t = sqrt(d * d - y * y);
a[i] = {double(x - t), double(x + t)};
}
}
if (fail == true) {
puts("-1");
}
else {
sort(a, a + n, cmp);
double last = -1e5;
for (int i = 0; i < n; i ++) {
if (last < a[i].first) {
last = a[i].second;
cnt ++;
}
}
cout << cnt;
}
return 0;
}