藍橋杯 演算法訓練 攔截飛彈

2021-10-05 05:34:10 字數 1426 閱讀 7589

問題描述

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

輸入飛彈依次飛來的高度(雷達給出的高度資料是不大於30000的正整數),計算這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。

輸入格式

一行,為飛彈依次飛來的高度

輸出格式

兩行,分別是最多能攔截的飛彈數與要攔截所有飛彈最少要配備的系統數

樣例輸入

389 207 155 300 299 170 158 65

樣例輸出62

思路1、首先是求最長非遞增子串行,套用模板就可以。

2、下面是怎麼求最少系統數。別的答案都是直接給出解法為lis,但是沒說明為什麼。其實道理很簡單,因為在最長遞增子串行中的每乙個元素都必須被不同的系統打下來,不可能被同乙個系統打下來。那麼為什麼最長遞增子串行的個數就是最少的系統數呢?

我們考慮最長遞增子串行為60,70,80,90,100。在該序列之外,假如某個的飛彈高度為65,那麼應該跟最長遞增子串行中的60屬於同一組(被同乙個系統打下來);假如另外的飛彈高度為95,那麼應該跟最長遞增子串行中的90屬於同一組;假如另外的飛彈為60,那麼也應該跟最長遞增子串行中的60屬於同一組…

由此可見,最長遞增子串行的個數就是最少的系統數,這個最少系統數的確可以保證將所有飛彈都給攔截下來。

#include

#include

#include

using

namespace std;

int a[

10005];

int dp[

10005

],dpdp[

10005];

int ans=1;

//最多攔截飛彈數

int cnt=1;

//最少系統數

intmain()

int size=i-1;

//計算最長非遞增子串行

for(

int i=

2;i<=size;i++)}

ans=

max(ans,dp[i]);

}printf

("%d\n"

,ans)

;//計算最長遞增子串行

for(

int i=

2;i<=size;i++)}

cnt=

max(cnt,dpdp[i]);

}printf

("%d\n"

,cnt)

;return0;

}/*300 207 155 300 299 170 158 65

*/

藍橋杯 演算法訓練 攔截飛彈

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

藍橋杯 演算法訓練 攔截飛彈

試題 演算法訓練 攔截飛彈 資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系...

藍橋杯 攔截飛彈

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