time limit: 1000/1000ms (c++/others) memory limit: 65536/65536kb (c++/others)
problem description我們假設海岸線是一條無限直線:以海岸線為界,陸地和海洋被分開,在海邊分布著很多小島。現在,我們在海岸線上安裝雷達,每個雷達有固定的通訊範圍(以d為半徑的圓形區域),這樣,海邊的小島就可以被某個雷達訊號覆蓋。
這裡我們使用笛卡爾座標系,定義海岸線為x軸,x軸上方是海洋,下方是陸地。給出分布在海邊每個小島的座標位置和雷達訊號能覆蓋的範圍d,你的任務是計算出最小需要安裝的雷達數目,使得這些雷達訊號能覆蓋到所有海邊的小島。每個小島的座標格式為(x,y)。
如下圖所示,給出第乙個輸入樣例的座標表示,這樣在(-2,0),(1,0)上分別安裝雷達就可以覆蓋所有的小島(p點),所以我們只需要安裝2個雷達。
input
輸入包含多組測試樣例。每組測試第一行包含兩個整數n(1<=n<=1000)和d,n表示小島的數目,d表示雷達能覆蓋的範圍的半徑。接下來n行,每行由整數x和y組成,表示n個小島的座標位置。每兩組資料之間有乙個空行。
輸入0 0表示輸入的結束。
output
對於每一組輸入,按照輸出樣例中的格式輸出:包含輸出序號和最少需要安裝雷達的數目。如果找不到解決方案,即不能找到一種安裝方案覆蓋所有的小島,輸出」-1」。
sample input
3 2sample output1 2-3 1
2 11 2
0 20 0
case 1: 2case 2: 1
#include#include#include
#define fi first //
巨集定義 為了**簡便
#define se second //
分別表示pair中的第乙個數和第二個數
using
namespace
std;
const
int maxn = 1e5+5
;pair
a[maxn];
intmain()
a[i].fi = x - sqrt(d*d - y*y); //
可覆蓋第i個點,在x軸上最左側的位置
a[i].se = x + sqrt(d*d - y*y); //
可覆蓋第i個點,在x軸上最右側的位置
} printf(
"case %d:
", cs++);
if(!can)
int cnt = 1
; sort(a, a+n); //
預設按照第乙個數公升序優先,第二個數公升序的順序排序
pair now = a[0]; //
初始化可用區間
for(int i=1; i)
else
if(now.se > a[i].se) now = a[i]; //
當前區間過大,需要減小可用區間
} printf(
"%d\n
", cnt);
}return0;
}
雷達安裝(貪心)
題目描述 假定海岸線是一條無限延伸的直線,陸地在海岸線的一邊,大海在另一側。海中有許多島嶼,每乙個小島我們可以認為是乙個點。現在要在海岸線上安裝雷達,雷達的覆蓋範圍是d,也就是說大海中乙個小島能被安裝的雷達覆蓋,那麼它們之間的距離最大為d。我們使用平面直角座標系,定義海岸線是x軸,大海在x軸上方,陸...
luogu P1325 雷達安裝
描述 假設海岸線是一條無限延伸的直線。它的一側是陸地,另一側是海洋。每一座小島是在海面上的乙個點。雷達必須安裝在陸地上 包括海岸線 並且每個雷達都有相同的掃瞄範圍d。你的任務是建立盡量少的雷達站,使所有小島都在掃瞄範圍之內。資料使用笛卡爾座標系,定義海岸線為x軸。在x軸上方為海洋,下方為陸地。樣例1...
P1325 雷達安裝
描述 假設海岸線是一條無限延伸的直線。它的一側是陸地,另一側是海洋。每一座小島是在海面上的乙個點。雷達必須安裝在陸地上 包括海岸線 並且每個雷達都有相同的掃瞄範圍d。你的任務是建立盡量少的雷達站,使所有小島都在掃瞄範圍之內。資料使用笛卡爾座標系,定義海岸線為x軸。在x軸上方為海洋,下方為陸地。樣例1...