安裝雷達POJ 1328(貪心)

2022-09-23 16:21:08 字數 1888 閱讀 6407

翻譯過來就是:

解題思路:

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

說實話作為乙個小白而言上面這個真的不容易看懂,但是可以作為經驗來積累,以每乙個區間的起點進行放置雷達。

首先我發現了一件事就是貪心法好像很多都有編號這個步驟。這個其實根據這個區間來理解其實就不會很複雜了第乙個雷達放在第三個區間的起點。第二個雷達放在倒數第二個。這樣依次類推。

後面貪心法的證明我不愛寫了,我覺得這個替換法難度還是偏大,我後面自己醞釀一下再來寫吧。

後面是**實現。

#include #include 

#include

using

namespace

std;

struct

island island[

1000

];/*

貪心思想,很多情況下是考慮極值,本題也正是先將每個island的區間求出來,什麼是區間?

* 其實就是在海岸邊(也就是x軸上)的範圍內任何乙個位置放置乙個雷達都能夠覆蓋到這個島,就稱

* 這個島的區間! */

/*** 比較函式。 選用什麼排序是關鍵,一開始錯誤地選擇了橫座標x排序,結果資料基本對的上,

* 仔細一想其實應該是要用每個island的左右閉區間端點排序才對。 第二次選擇的時候,又

* 錯誤地選擇了右區間端點,其實應該選擇左端點,從***的貪心的具體演算法可以看出,其實

* 我是用min(左端點)去確保從右往左的所有island能夠covered。 */

int cmp(const island &a, const island &b)

intmain()

island[i].max = island[i].x + sqrt(d * d - island[i].y *island[i].y);

island[i].min = island[i].x - sqrt(d * d - island[i].y *island[i].y);

}if(isok == 1

) sort(island, island +n, cmp);

double

min;

int j = n - 1

;

/*關鍵是 當 island[j].max < min 的時候,是指從右往左乙個個island掃瞄的時候,保證每個都能覆蓋到,而且是用最少的雷達數。

*/for(i = j; i >= 0; i --, i =j) }}

printf(

"case %d: %d\n

", cases, count);

cases ++;

}return0;

}

POJ1328貪心放雷達

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

poj 1328 雷達覆蓋 貪心

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

poj1328 雷達安裝問題

描述 假設滑行是無限直線。土地位於海岸的一側,海洋位於另一側。每個小島都位於海邊。並且位於滑行的任何雷達裝置只能覆蓋d距離,因此如果它們之間的距離最多為d,則可以通過半徑裝置覆蓋海中的島嶼。我們使用笛卡爾座標系,定義滑行是x軸。海側在x軸上方,陸側在下方。考慮到每個島嶼在海中的位置,並考慮到雷達裝置...