C 安裝雷達

2022-08-18 15:48:14 字數 1667 閱讀 7132

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 2

1 2-3 1

2 11 2

0 20 0

sample output

case 1: 2

case 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...