POJ 1328 貪心演算法

2021-08-28 02:30:31 字數 1908 閱讀 4978

雷達安裝

時間限制:1000ms

記憶體限制:10000k

提交總數:109120

接受:24128

描述

假設滑行是無限直線。土地位於海岸的一側,海洋位於另一側。每個小島都位於海邊。並且任何位於滑行的雷達裝置只能覆蓋d距離,因此如果它們之間的距離最多為d ,則可以通過半徑裝置覆蓋海中的島嶼。 

我們使用笛卡爾座標系,定義滑行是x軸。海側在x軸上方,陸側在下方。考慮到每個島嶼在海中的位置,並考慮到雷達裝置覆蓋範圍的距離,您的任務是編寫乙個程式,以找到覆蓋所有島嶼的最小數量的雷達裝置。注意,島的位置由其xy座標表示。 

圖阿雷達裝置的示例輸入

輸入

輸入包含幾個測試用例。每種情況的第一行包含兩個整數n(1 <= n <= 1000)和d,其中n是海中島嶼的數量,d是雷達裝置的覆蓋距離。接下來是ñ行,每行包含兩個整數,表示每個島的位置座標。然後是乙個空白行來分隔案例。 

輸入由包含零對的行終止 

產量

對於每個測試用例輸出,一行包含測試用例編號,然後是所需的最少數量的雷達安裝。「 - 1」安裝意味著沒有解決方案。

樣本輸入

3 2 

1 2

-3 1

2 1

1 2

0 2

0 0

樣本輸出

案例1:2 

案例2:1

這個題首先需要對座標進行排序,我剛開始因為沒有排序而進行了無數次為和而導致了超時,,, o(╯□╰)○

這個題的最著名就是用貪心演算法來算啦。

貪心演算法的基本思路就是:

從問題的某乙個初始解出發逐步逼近給定的目標,以盡可能快的地求得更好的解當達到演算法中的某一步不能再繼續前進時,演算法停止。 

即:從問題的某一初始解出發; 

求出可行解的乙個解元素; 

由所有解元素組合成問題的乙個可行解;

關於貪心演算法的例子,讀者可移步:https:

當小島在雷達的最外邊時,雷達覆蓋的小島是最多的。故此,先計算出以每個小島為圓心,算出每個小島與海岸的左右交點。

之後進行比較,有以下三種情況:

原始碼如下:

#include#include#include#includeusing namespace std; 

struct coo

coo[1100];

int comp(const coo &s1,const coo &s2)//自己定義的排序規則

coo[i].x_l=coo[i].x-sqrt(r*r-coo[i].y*coo[i].y);

coo[i].x_r=coo[i].x+sqrt(r*r-coo[i].y*coo[i].y);

} if(outcome!=1)

sort(coo,coo+n,comp);

for(i=1,j=0;icoo[i].x_r)

j=i;

if(coo[j].x_r筆者這裡還有乙個會場安排的問題,演算法也是貪心:

其實,與貪心演算法同樣是求最優問題的還有乙個動態規劃問題

傳送門:

POJ1328貪心放雷達

題意 有乙個二維座標,y 0是海,y 0是陸地,然後只能在y 0的岸邊上放雷達,有n個城市需要被監控,問最少放多少個雷達。思路 貪心去做就行了,其實題目不難但是這個題目過的並不怎麼順利,哎!一開始我的想法是按照x排序,然後從左往右乙個乙個放置雷達,第乙個放在第乙個點相切的右側,結果果斷wa了,然後就...

poj 1328 雷達覆蓋 貪心

題目 題意 在x軸上某些位置裝雷達,問怎麼才能使海島p被訊號覆蓋,有n個海島,雷達覆蓋範圍是d。分析 考慮乙個海島p,對於覆蓋它的雷達放的最優的位置是它在圓圈的邊緣上,因為這樣這個雷達就可以覆蓋更多其他的海島。那麼先按x排序,對於當前的乙個圈,看看是否下乙個海島是否可以在圈內,如果可以就在看下乙個,...

安裝雷達POJ 1328(貪心)

翻譯過來就是 解題思路 把這個二維的問題轉化為轉化為一維的問題。如上圖所示,只需要雷達安裝在這個區間中的話,雷達就能夠覆蓋到上面的島嶼。現在這個問題又變成區間排程問題了。但是還有乙個問題就是在這個區間中說明位置上放置雷達呢?這個區間可是有無數個點,列舉肯定不可能。解決方向如下 說實話作為乙個小白而言...