題意大致是,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 則可以通過半徑裝置覆蓋海中的島嶼。我們使用...