AcWing 1010 攔截飛彈

2021-09-27 13:14:08 字數 946 閱讀 7512

解題思路:

這道題目的第乙個問題就是求最長下降子串行,直接用乙個dp就可以了;

而對於第二個問題,問最少用多少個系統可以攔截所有的飛彈,我剛還是的思路是不斷地去求最長下降子串行,指導飛彈被去完為止,但是後來我找到了這個思路的乙個bug,然後想我們可以直接維護乙個陣列,陣列裡面就是各自系統中最小的飛彈的高度,由於我們需要把所有的飛彈都給截獲,所以對於每乙個飛彈我們要麼就是用乙個新系統來截獲,要麼就使用正在使用中的乙個飛彈進行截獲,然後最優的方法是用正在使用中的飛彈系統中 高度大於並且最接近於當前飛彈高度 的系統進行截獲,如果沒有這樣的系統,就直接再啟動乙個系統;(我覺得第二個問題像貪心),然後我想到如果我們每次都直接用sort維護這個陣列然後再使用二分覺得時間複雜度可能會比較高,但估計也不會超時,在這裡我是用使用乙個set來維護的。

**:

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

1e3+5;

int a[maxn]

, cnt;

int f[maxn]

, pre[maxn]

, num;

bool vis[maxn]

;set<

int> st;

intmain

(void

) maxx =

max(maxx, a[i]);

}printf

("%d\n%d\n"

, res, st.

size()

);return0;

}

總結:我發現對於這種dp型別的問題,似乎正確的答案都不會是一遍的最優子結構堆積而成的,我們需要同時考慮多種路徑(系統),直接得到乙個最優解。

AcWing1010 攔截飛彈

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

Acwing 1010 攔截飛彈 單調子串行

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

1010 攔截飛彈

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