本題的乙個重要轉化是:將每小島的位置轉換成乙個線段,然後求能夠使得每個線段上都有乙個點的情況下,需要的點的最小個數。因為有重疊部分的線段只需要乙個點就可以,所以重點在於求線段的交集。
對於一組線段組成的集合,當且僅當 這個集合中最大的左端點小於最小的右端點的時候,這一組線段集合才會都重疊。
#include#include#include#includeusing namespace std;
const int max = 1010;
int n, d;
int tot = 1;
struct node;
node a[max];
bool cmp(const node& a, const node& b)
void solve()
// 如果現在的集合不能加入這個線段,那麼就新開乙個集合,其最小右端點就是該線段的右端點
else
} cout << "case " << tot << ": " << ans << endl;
tot++;
} int main()
// 計算能夠覆蓋該點的圓心所在的線段
a[i].left = (double)x - sqrt((double)d*d - (double)y*y);
a[i].right = (double)x + sqrt((double)d*d - (double)y*y);
} // 有解的話就solve
if (flag) solve();
// 無解就直接print -1
else
} return 0;
}
poj 1328 貪心(建立雷達覆蓋小島)
題意 x軸上方有若干小島,用座標 x,y 給出。現要在x軸上建立若干雷達,雷達的半徑 r 全部相同,且由輸入給定。問為了覆蓋全部小島,最少需要建立多少雷達?思路 對每個小島座標,求出需要覆蓋它的雷達的x座標範圍,可以得到一系列區間。問題變成每個區間裡至少選一點,問最少的選點數量。將所有區間按照右側大...
POJ 1328 放置雷達
這是一道貪心的題目,首先我們要知道,我們放置雷達的話我們可以做乙個轉換,就是已知島嶼的點座標的時候,我們可以算一下,這個點以d為半徑與x軸交點之間的線段在x軸上的投影,然後我們只需要在這個投影範圍內設定乙個雷達就可以了。然後我們讀入資料的時候,因為題目中說道,如果計算不出結果我們就輸出 1,一般來是...
POJ1328貪心放雷達
題意 有乙個二維座標,y 0是海,y 0是陸地,然後只能在y 0的岸邊上放雷達,有n個城市需要被監控,問最少放多少個雷達。思路 貪心去做就行了,其實題目不難但是這個題目過的並不怎麼順利,哎!一開始我的想法是按照x排序,然後從左往右乙個乙個放置雷達,第乙個放在第乙個點相切的右側,結果果斷wa了,然後就...