[AcWing] 雷達設備

雷達設備

題目

假設海岸是一條無限長的直線,陸地位於海岸的一側,海洋位於另外一側。

每個小島都位于海洋一側的某個點上。

雷達裝置均位於海岸線上,且雷達的監測範圍爲d,當小島與某雷達的距離不超過d時,該小島可以被雷達覆蓋。

我們使用笛卡爾座標系,定義海岸線爲x軸,海的一側在x軸上方,陸地一側在x軸下方。

現在給出每個小島的具體座標以及雷達的檢測範圍,請你求出能夠使所有小島都被雷達覆蓋所需的最小雷達數目。

輸入格式

第一行輸入兩個整數n和d,分別代表小島數目和雷達檢測範圍。

接下來n行,每行輸入兩個整數,分別代表小島的x,y軸座標。

同一行數據之間用空格隔開。

輸出格式

輸出一個整數,代表所需的最小雷達數目,若沒有解決方案則所需數目輸出“-1”。

數據範圍

1n10001≤n≤1000

輸入樣例

3 2
1 2
-3 1
2 1

輸出樣例

2

題解

思路

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章