POJ 1328 還是區間貪心 數學思維

2021-09-19 23:45:55 字數 1720 閱讀 3933

題意大致是,x-y座標系中,x軸上方有n個點,

那麼此時讓你在x軸上選若干點,以半徑為d作圓,使得上方的點都坐落在圓內,並且作的圓數量最少.

一般這種在若干東西裡選取若干,使得選取數量最少,一般是貪心.

這題看著不好求解,那麼數學上進行轉化.

對於x軸上方的點p,顯然如果縱座標y大於d時,無法被圓心在x軸上的圓圈住,此時輸出-1

那麼對於點p(x,y),數學角度上,建立三角形,delta=d*d-y*y,以區間[x-delta,x+delta]上的點作為圓心的圓肯定是可以包圍p的.

這樣就轉化成區間貪心,若干區間,選取/標記最少的點,讓所有區間都能被標記.

然後發現對一系列區間,如果乙個區間和其他很多不同區間有重複部分,只要任選乙個有交集的區間,

重複上乙個操作,然後直到取不到為止

最後發現,無論是如何取有交集的區間,最後ans的值是一樣的.

感覺可以用動態規劃的思想證明這個貪心策略

然後直接暴力,1e6不會超時

#include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int maxn=100010;

const int inf=0x3f3f3f3f;

struct node a[maxn];

bool cmp(const node &a,const node &b)

int n,cnt;

double x,y,d;

bool vis[maxn];

queue que;

int main()

if(flag)

sort(a,a+n,cmp);

for(int i=0;i這題一開始wa,原因竟然是我在ans=-1情況下直接輸出-1...

emmm

看了題解才發現有o(n)的做法.....

這種做法基本就是poj3069的變形了

大致思路一樣,就是不從區間入手,從選取的點入手,因為一段區間必然要選取某個點,那麼我們每次都選擇最優的.

顯然這種區間問題,要先進行排序,然後選取區間的端點值,這樣在有序的情況下,端點值一定是區域性最優,因此推出整體最優

先對l進行降序排序,然後選取第乙個點的l作為此時該區間的最優點,(顯然,此時對於後面的區間,最左端覆蓋得的區域最大,因此貪心策略是正確的)

然後找到無法被囊括的區間,此時再去更換temp

#include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int maxn=100010;

const int inf=0x3f3f3f3f;

struct node a[maxn];

bool cmp(const node &a,const node &b)

int n,cnt;

double x,y,d;

int main()

if(flag)

sort(a,a+n,cmp);

double t=a[0].l;

for(int i=1;i無論是時間複雜度還是**可讀性都有大大的提公升.

POJ 1328 區間貪心,幾何

題目大意 以x軸為分界,y 0部分為海,y 0部分為陸地,給出一些島嶼座標 在海中 再給出雷達可達到範圍,雷達只可以安在陸地上,問最少多少雷達可以覆蓋所以島嶼。include include include includeusing namespace std int n,m struct node...

POJ1328貪心放雷達

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

POJ 1328 貪心演算法

雷達安裝 時間限制 1000ms 記憶體限制 10000k 提交總數 109120 接受 24128 描述 假設滑行是無限直線。土地位於海岸的一側,海洋位於另一側。每個小島都位於海邊。並且任何位於滑行的雷達裝置只能覆蓋d距離,因此如果它們之間的距離最多為d 則可以通過半徑裝置覆蓋海中的島嶼。我們使用...