P1325 雷達安裝

2022-05-03 13:27:18 字數 1714 閱讀 3468

描述:

假設海岸線是一條無限延伸的直線。它的一側是陸地,另一側是海洋。每一座小島是在海面上的乙個點。雷達必須安裝在陸地上(包括海岸線),並且每個雷達都有相同的掃瞄範圍d。你的任務是建立盡量少的雷達站,使所有小島都在掃瞄範圍之內。

資料使用笛卡爾座標系,定義海岸線為x軸。在x軸上方為海洋,下方為陸地。

樣例1如圖所示

輸入格式:

第一行包括2個整數n和d,n是島嶼數目,d是雷達掃瞄範圍。

接下來n行為島嶼座標。

輸出格式:

乙個整數表示最少需要的雷達數目,若不可能覆蓋所有島嶼,輸出「-1」。

輸入樣例#1: 複製

3 2

1 2-3 1

2 1

輸出樣例#1: 複製

2
n \le 1000n≤1000 ,d \le 20000d≤20000

| x_i | \le 2 \times 10^6∣xi​∣≤2×106 ,0 \le y_i \le 200000≤yi​≤20000

//

* 雷達覆蓋問題 - 問題轉化:

//-1、將問題稍微進行轉化:將基站設為覆蓋半徑為 d。 則問題變為:每個基站的覆蓋區域必須要有雷達。

//-2、又因為雷達只能放在 x 軸上,所以每個基站覆蓋的其實是一條線段。 則問題變為:每條線段上必須要要 有雷達。

//-3、又因為雷達只能放在 x 軸上,所以每個基站覆蓋的其實是一條線段。則問題變為:每條線段上必須要要 有雷達。

////

問題:如何貪心?回想活動安排問題。

//解題思路:

//先計算出每個島嶼與x軸的左右交點,然後按照右端點進行排序,列舉每乙個島嶼,

//①如果這個島嶼沒有被雷達覆蓋,那麼就將乙個雷達放在其與x軸的右端交點,並列舉這個島嶼後面的島嶼,判斷這個雷達能否將後面的島嶼覆蓋。

//②如果該島嶼已經被覆蓋,則直接跳過。

#include

#include

#include

#include

#include

#define date 100005

using

namespace

std;

intn;

intd;

intsum;

intx,y;

float

z;int

line[date];

struct

point

point[date];

bool cmp(point a,point b) //

按照與x軸右側的交點排序

void

work()}}

}cout

<

}void

init()

z=sqrt(d*d-y*y); //

計算與x軸的交點

point[i].x=x-z; //

左交點

point[i].y=x+z; //

右交點

} sort(point+1,point+n+1,cmp); //

排序 work();

}int

main()

luogu P1325 雷達安裝

描述 假設海岸線是一條無限延伸的直線。它的一側是陸地,另一側是海洋。每一座小島是在海面上的乙個點。雷達必須安裝在陸地上 包括海岸線 並且每個雷達都有相同的掃瞄範圍d。你的任務是建立盡量少的雷達站,使所有小島都在掃瞄範圍之內。資料使用笛卡爾座標系,定義海岸線為x軸。在x軸上方為海洋,下方為陸地。樣例1...

YBTOJ Luogu P1325 雷達安裝

有 n 個點,第 i 個點的座標是 x i,y i 現在要你在 x 軸上標記若干個位置,使得每個點都能被乙個以被標記位置為圓心,半徑為 d 的圓覆蓋。求最少標記多少位置。首先任意一點如果的 y 座標如果大於 d 那麼肯定覆蓋不到,直接輸出 1。接下來考慮用貪心求解這個問題。容易發現,點 i 要被覆蓋...

洛谷P1352 雷達安裝

描述 假設海岸線是一條無限延伸的直線。它的一側是陸地,另一側是海洋。每一座小島是在海面上的乙個點。雷達必須安裝在陸地上 包括海岸線 並且每個雷達都有相同的掃瞄範圍d。你的任務是建立盡量少的雷達站,使所有小島都在掃瞄範圍之內。資料使用笛卡爾座標系,定義海岸線為x軸。在x軸上方為海洋,下方為陸地。樣例1...