描述:
假設海岸線是一條無限延伸的直線。它的一側是陸地,另一側是海洋。每一座小島是在海面上的乙個點。雷達必須安裝在陸地上(包括海岸線),並且每個雷達都有相同的掃瞄範圍d。你的任務是建立盡量少的雷達站,使所有小島都在掃瞄範圍之內。
資料使用笛卡爾座標系,定義海岸線為x軸。在x軸上方為海洋,下方為陸地。
樣例1如圖所示
輸入格式:
第一行包括2個整數n和d,n是島嶼數目,d是雷達掃瞄範圍。
接下來n行為島嶼座標。
輸出格式:
乙個整數表示最少需要的雷達數目,若不可能覆蓋所有島嶼,輸出「-1」。
輸入樣例#1: 複製
3 2輸出樣例#1: 複製1 2-3 1
2 1
2n \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...