code VS 1044 攔截飛彈

2021-08-13 23:55:14 字數 1306 閱讀 8267

rt

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

輸入飛彈依次飛來的高度(雷達給出的高度資料是不大於30000的正整數)

輸出這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。

389 207 155 300 299 170 158 656 2

飛彈的高度<=30000,飛彈個數<=20

這道題目來自2023年noip全國聯賽提高組。是乙個基礎的序列型動態規劃問題。

第一問很簡單,直接找出最長不增子序列的長度即可

一維dp輕鬆處理

結果第二問碰釘子

考慮搜尋,用乙個use陣列來記錄是否被攔截,但是發現gg,不太好確定前幾組的最小的那個數

下面說一下思路

由於單增子序列一定不在不增子序列中,所以,攔截飛彈時這幾個飛彈絕對不能用一台機器搞定

所以由此確定了機器的最少數量

再一想,其他的那些個飛彈肯定都能順帶著搞定

我不會證明,所以就這樣簡單敘述下吧

所以貼**

#include

#include

using

namespace

std;

int main()

; int num=0;

while(cin>>a[num])

int dp1[25]= ,dp2[25]= ;

dp1[0]=1;

dp2[0]=1;

for(int i=1; iint max1=1;

int max2=1;

for(int j=0; jif(a[i]<=a[j]) max1=max(max1,dp1[j]+1);

if(a[i]>a[j]) max2=max(max2,dp2[j]+1);

}dp1[i]=max1;

dp2[i]=max2;

}for(int i=0; iif(dp1[num-1]1]=dp1[i];

if(dp2[num-1]1]=dp2[i];

}cout

<1]<1]0;}

寫**的時候有一處特別二的錯誤,就是一直想著繼承上一步的最大值,但是卻一直忘了寫,於是只能在最後面又加了乙個迴圈去找最大值

由於最後一位可能是個很小的數,就導致答案想要的那個最大值,不應該是在最後一位出現的,而是在前面的某個較大的數那裡出現的

codevs1044攔截飛彈

這個題第一問是求最長下降子串行,第二問可以轉化成求最長上公升子串行,為什麼?因為我們每遇到有hi hj的情況 i j 都要再使用一枚飛彈,因為飛彈只處理hi hj的情況嘛,很好理解的吧 所以 如下 完全可以更短 include include include include using namesp...

codevs 1044 攔截飛彈

傳送門 解題思路 首先求解最多攔截多少飛彈,每個飛彈有兩種情況,攔截或者不攔截,01揹包問題,但是空間複雜度比較高。我們可以考慮這樣乙個問題,攔截的最後乙個飛彈一定時最小的,因此我們從後往前找,只要這個飛彈之後沒有更小的,那麼這就是最後乙個飛彈,如果有更小的,那這個就是更小的那個飛彈的前乙個。所以我...

codevs 攔截飛彈 1044

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