【問題描述】
某國為了防禦敵國的飛彈襲擊,開發出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲,並觀測到飛彈依次飛來的高度,請計算這套系統最多能攔截多少飛彈。攔截來襲飛彈時,必須按來襲飛彈襲擊的時間順序,不允許先攔截後面的飛彈,再攔截前面的飛彈。
【輸入形式】
每組輸入有兩行,
第一行,輸入雷達捕捉到的敵國飛彈的數量k(k<=25),
第二行,輸入k個正整數,表示k枚飛彈的高度,按來襲飛彈的襲擊時間順序給出,以空格分隔。
【輸出形式】
每組輸出只有一行,包含乙個整數,表示最多能攔截多少枚飛彈。
【樣例輸入】
8300 207 155 300 299 170 158 65
【樣例輸出】
6【問題分析】
該問題就是要從輸入的資料數列中尋找滿足條件的最長子數列(從左到右的非遞增數列),運用圖論中求最短路徑的dijkstra演算法的思想,從左往右依次計算每個資料到「出發點資料」的最大距離,即到該資料為止前面的數列中包含此資料的非遞增子數列的最大長度。
【程式設計】
①將飛彈宣告為結構體,value用於飛彈儲存高度,結構體的另乙個資料d用於儲存「到該資料為止前面的數列中包含此資料的非遞增子數列的最大長度」。
②每輸入乙個資料,將其存於乙個結構體中,並將d初始化為0(與dijkstra演算法中將d初始化為∞同理),然後將該結構體壓入到容器中。
③從容器中的第乙個元素開始,將元素與其前面的所有元素依次進行比較,如果≤前面的某個元素,則將前面元素的d1+1後與該元素對應的d2比較,若d1+1>d2,則d2=d1+1。
④最後得到容器中所有結構體元素中的最大d值即為所求結果。
【示例**】
#include
using
namespace std;
struct node
;bool
cmp(
int p,
int q)
intmain()
int max=0;
for(
int i=
0;i)else
bool flag=
false
;for
(int j=
0;jif(flag==
true
)else}if
(max.d)}
cout
}
飛彈防禦系統
飛彈防禦系統 為了對抗附近惡意國家的威脅,r國更新了他們的飛彈防禦系統。一套防禦系統的飛彈攔截高度要麼一直嚴格單調上公升要麼一直嚴格單調下降。資料範圍 1 n 50 輸入樣例 5 3 5 2 4 1 0輸出樣例 2樣例解釋 對於給出樣例,最少需要兩套防禦系統。一套擊落高度為3,4的飛彈,另一套擊落高...
飛彈防禦系統 飛彈攔截系統
題目鏈結 引言 請忽略 今天是小白acm集訓的日子,然後資料結構實在是太難了,真是學不動了,然後就只能無助地去複習以前的題了,記得以前在sdut程設二裡面有一道題叫最少攔截系統,它是一道貪心,我個人覺得最長上公升子串行的思路跟它有些相似。我們先分析一下這道題,引入一下這道最少攔截系統的題幹和 最少攔...
1048 飛彈防禦系統
時間限制 1 sec 記憶體限制 128 mb 提交 305 解決 75 提交 狀態 討論版 某國為了防禦敵國的飛彈襲擊,開發出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲,並觀測到飛...