動態規劃 飛彈攔截

2021-06-02 08:39:04 字數 1640 閱讀 6361

某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:

雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷

達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有

的飛彈。

輸入資料:

第一行為乙個整數 n,表示飛來的飛彈個數,n<=100000

第二行為 n 個整數,依次表示飛彈飛來的高度,高度資料為不大於 30000 的正整數。

輸出資料:

第一行,輸出計算這套系統最多能攔截多少飛彈

第二行,輸出要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。

樣例 輸入檔案:missile.in

8 389 207 155 300 299 170 158 65

輸出檔案:missile.out

6

2

這是一道線性動態規劃,但需要單調佇列和二分優化。

優化前的求最長不降子串行的方法:用f[i]表示以i結尾的最長不降子串行的長度,然後用這個方程f[i] = max(f[j]) + 1(j的高度必須大於等於i的高度)轉移。

優化方法:

求最長不降子串行時,維護乙個len[height]值,即f值為height的最大下標,則每次只需要找到乙個在len陣列中的高度恰好大於f[i]的值,這樣就可以使用二分優化了。

由於len陣列是單調的,每次用二分找到這個位置,最後形成的乙個最大長度的len陣列即為所求。

對於題目中的第二個問,只需要求一次最長上公升子串行即可。

accode:

#include #include #include #include using std::max;

using std::min;

const char fi = "missile.in";

const char fo = "missile.out";

const int maxn = 100010;

const int max = 0x3fffff00;

int len[maxn];

int h[maxn];

int n;

void init_file()

void readdata()

void work()

else r = mid - 1;

}now = c + 1;

len[now] = max(len[now], h[i]);

ans = max(ans, now);

}printf("%d\n", ans);

ans = 0;

len[0] = 0;

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

len[i] = max;

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

else r = mid - 1;

}now = c + 1;

len[now] = min(len[now], h[i]);

ans = max(ans, now);

}printf("%d", ans);

} int main()

飛彈攔截 動態規劃

描述 某國為了防禦敵國的飛彈襲擊,開發出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲,並觀測到飛彈依次飛來的高度,請計算這套系統最多能攔截多少飛彈。攔截來襲飛彈時,必須按來襲飛彈襲擊的...

動態規劃之飛彈攔截

題目描述 某國為了防禦敵國的飛彈襲擊,發展一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於等於前一發的高度。某天,雷達捕捉到敵國飛彈來襲。由於該系統還在試用階段,所以只用一套系統,因此有可能不能攔截所有的飛彈。輸入資料 第一行輸入測...

動態規劃 攔截飛彈

動態規劃 攔截飛彈 時間限制 1 sec 記憶體限制 256 mb 張琪曼 老師,修羅場是什麼?墨老師 修羅是佛家用語,修羅畢生以戰鬥為目標,修羅場指的是他們之間的死鬥坑,人們通常用 修羅場 來形容慘烈的戰場。後來又引申出 乙個人在困境中做絕死奮鬥 的意思。所以,這其實也在暗示我們,即使是身處絕境,...