這是一道貪心的題目,首先我們要知道,我們放置雷達的話我們可以做乙個轉換,就是已知島嶼的點座標的時候,我們可以算一下,這個點以d為半徑與x軸交點之間的線段在x軸上的投影,然後我們只需要在這個投影範圍內設定乙個雷達就可以了。
然後我們讀入資料的時候,因為題目中說道,如果計算不出結果我們就輸出-1,一般來是可以得到結果的,所以如果出現異常,那肯定是資料的鍋。
我們讀的時候判斷一下y值,如果大於d的值的話,我們就給乙個flag標記,然後在讀入完成之後,直接輸出-1,跳出這重迴圈,繼續對下一組資料進行操作。
根據之前的投影,我們只需要記錄每個島嶼的投影開始的x值和結束的x值就可以了。
接下來我們就開始計算這雷達的安放數目了,我們可以知道如果在同乙個雷達的作用範圍可以覆蓋多個島嶼的話,我們就在這些處於同一範圍的島嶼的最後乙個島的投影開始x值處,安放乙個雷達就可以了。
這是因為如果這些島嶼若不能被這個雷達覆蓋的話,就是兩種情況:
第一種情況就是,其中的乙個島嶼的它的左端點已經超過了最右邊的那個端點的開始x值,這樣就與我們的假設矛盾了,所以不成立。
第二種情況就是,其中的乙個島嶼的右端點小於了最右邊的那個島嶼的左值,這樣子的話,它又與我們的假設相矛盾了。因為如果小於左值,就說明它的範圍已經不跟後面的島是同乙個範圍的了,乙個雷達是不可能覆蓋這些島嶼的。
我們執行的時候,也是進行兩重迴圈,第一重迴圈推進島嶼,第二重迴圈就從上次未覆蓋的島嶼開始直到一重迴圈的i值-1的位置,進行比對,比較這之間的島嶼的結束位置是否大於島嶼i的開始位置,如果大於,就不做任何操作。
如果小於就說明除了島嶼i之外,上次未覆蓋島嶼到i-1的島嶼是處在同乙個雷達範圍之下的,我們在i-1直接設定乙個雷達即可。
這樣子的話,就是ans++的操作,然後更新最新的未被覆蓋的島嶼的位置,然後跳出內層迴圈。
但是ans這個值的話,我們要給它設定成1,因為如果只有乙個島嶼的話,我們進入迴圈之後就會發現i=0,此時第一次進入,最新未被覆蓋的島嶼位置也是0,然後我們無法進入內層迴圈,然後就無法進行++操作。
但是我們設定為1的目的並不是為了第乙個島,這也與我們的初衷相悖,與我們的思路不一樣,我們設定的目的是為了給最後乙個島進行加一的操作。
我們可以分析一下, 最後乙個島的情況,第一,它被之前的島覆蓋了,外層迴圈走到最後乙個島,內層迴圈進行比較,然後發現沒有結束的島嶼位置,也就是下一次的島嶼不能全部覆蓋的那個島嶼位置。
我們失去了結束的位置,然後ans就不能++,所以我們直接加1。另一種情況就是最後乙個島嶼也不被覆蓋,但是內層迴圈依舊找不到結束的位置,這樣內層迴圈結束,外層迴圈結束,ans依舊沒有加加。
所以我們直接給它設定成1,至於貪心演算法的正確性其實還有幾句話,但是看不看都已經無所謂了,直接看**去吧。
正確性:
假設你覺得有乙個雷達的放置序列是最少的,最佳的,然後我們按照上面的方法得出的是另乙個最佳結果。
好,我們來比較這兩個序列,設它們的開始是x1和y1(都是x的座標)。
如果x1如果x1>y1,這時候又分為兩種情況,第一就是y1如果它大於x2,這時候,根據我們的貪心策略,如果我們在i放置雷達,是因為我們如果在i+1的位置放置雷達,那就無法覆蓋i位置上的雷達了。
所以如果x1>y2的話,它本身也無法覆蓋1位置上的雷達,所以它本身就不是乙個正確的策略了。
所以貪心解法就是正確的。
#include #include #include using namespace std;
const double eps=1e-6;
struct island
if (error)
sort(island,island+n);
int end=0;
int ans=1;
for (int i=0;ielse
}} printf("case %d: %d\n",cnt++,ans);
} return 0;
}
POJ1328貪心放雷達
題意 有乙個二維座標,y 0是海,y 0是陸地,然後只能在y 0的岸邊上放雷達,有n個城市需要被監控,問最少放多少個雷達。思路 貪心去做就行了,其實題目不難但是這個題目過的並不怎麼順利,哎!一開始我的想法是按照x排序,然後從左往右乙個乙個放置雷達,第乙個放在第乙個點相切的右側,結果果斷wa了,然後就...
poj1328 雷達安裝問題
描述 假設滑行是無限直線。土地位於海岸的一側,海洋位於另一側。每個小島都位於海邊。並且位於滑行的任何雷達裝置只能覆蓋d距離,因此如果它們之間的距離最多為d,則可以通過半徑裝置覆蓋海中的島嶼。我們使用笛卡爾座標系,定義滑行是x軸。海側在x軸上方,陸側在下方。考慮到每個島嶼在海中的位置,並考慮到雷達裝置...
poj 1328 雷達覆蓋 貪心
題目 題意 在x軸上某些位置裝雷達,問怎麼才能使海島p被訊號覆蓋,有n個海島,雷達覆蓋範圍是d。分析 考慮乙個海島p,對於覆蓋它的雷達放的最優的位置是它在圓圈的邊緣上,因為這樣這個雷達就可以覆蓋更多其他的海島。那麼先按x排序,對於當前的乙個圈,看看是否下乙個海島是否可以在圈內,如果可以就在看下乙個,...