海岸雷達問題(java實現) 貪心演算法例題

2021-08-19 18:51:55 字數 1436 閱讀 8129

題目描述:

假定海岸線是一條無限延伸的直線,陸地在海岸線的一邊,大海在另一側。海中有許多島嶼,每乙個小島我們可以認為是乙個點。現在要在海岸線上安裝雷達,雷達的覆蓋範圍是r,也就是說大海中乙個小島能被安裝的雷達覆蓋,那麼它們之間的距離最大為d。 

我們使用平面直角座標系,定義海岸線是x軸,大海在x軸上方,陸地在下方。給你海中每乙個島嶼的座標位置(x,y)和要安裝的雷達所覆蓋的範圍d,你的任務是寫乙個程式計算出至少安裝多少個雷達能將所有的島嶼覆蓋。 

輸入描述:

第一行兩個整數n(1≤n≤100000)和d,分別表示海中島嶼的數目和雷達覆蓋的範圍半徑d。 

接下來n行,每行兩個整數,表示每個島嶼的座標位置(x,y)。 

輸出描述:

一行乙個整數,即能將所有島嶼全部覆蓋至少安裝的雷達個數

。解題思路: 

我一開始想,把所有的島嶼座標排序後,從左到右,然後對每個島嶼劃乙個圓,然後取右邊的與x的焦點,這樣肯定能覆蓋之後的島嶼,但是後來發現不行,因為如果是這樣的情況,塔就不能照射到第二個島。

所以存在問題,於是我換了乙個方法,吧每個島嶼的能放塔的x上的範圍記錄下來,比如

紅色是第乙個島的範圍,橙色是第二個島的範圍,我們先把塔放在第乙個島的右邊,之後進行判斷,如果第二個島的左邊點在塔的右邊,說明第二個塔太遠了,只能對第二個島嶼再設乙個塔。如果第二個島嶼的左邊小於塔1,右邊大於塔1,說明這個塔可以照射到島嶼2。就不用管這個島嶼了。如果第二個島嶼的右邊小於塔1,那麼直接吧塔1設定到第二個島嶼的右邊點就可以了。(因為之前已經排序,第二個島嶼的左邊點不可能小於第乙個島嶼左邊點)。所以一輪輪下去,就ok了。下面是**:

package 貪心演算法;

public class radarinstallations }}

}} public static void main(string args) ,};

//吧所有島嶼以r為半徑與x軸交於兩點的橫座標存入區域陣列place裡

double place = new double[n][n];

for (int i = 0; i < n; i++)

//排序二維陣列

sort2(island);

double tower = new double[n];

int count = 0;

tower[count] = place[0][1];//設定第一座燈塔

for (int i = 1; i < n; i++)

else

}} system.out.println(count + 1);

}}

貪心 雷達問題

張琪曼等人用時空雷達定位李旭琳所在的空間位置。如圖7.3所示,時空雷達裝在一條直線上,直線上方是空間海洋,每個人在空間海洋的位置就如同大海中的島嶼,這些人的位置已知,每乙個雷達的掃瞄範圍是乙個半徑為d的圓形區域,問最少需要多少個雷達覆蓋所有的人 島嶼 輸入包括多組測試資料,每組測試資料第一行為兩個整...

用貪心演算法揹包問題,Java實現

package n18 揹包問題貪心演算法 用貪心演算法解揹包問題 public class main 物體的重量 double v 物體的價值 double m 170 揹包所能容納的重量 int n w.length 1 物體的個數 double x new double n 1 每個物體裝進的...

貪心演算法實現會場安排問題

演算法概述 貪心演算法 又稱貪婪演算法 是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的...