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