最長不上公升序列(飛彈攔截)(2種複雜度演算法)

2021-08-28 16:45:03 字數 1348 閱讀 4089

題目描述

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

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

輸入輸出格式

輸入格式:

11行,若干個整數(個數 \le 100000≤100000)

輸出格式:

22行,每行乙個整數,第乙個數字表示這套系統最多能攔截多少飛彈,第二個數字表示如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。

輸入輸出樣例

輸入樣例#1: 複製

389 207 155 300 299 170 158 65

輸出樣例#1: 複製62

#include#includeusing namespace std;

int n,ans1,ans2,f[100001],a[100001];

int main()

ans1=max(ans1,f[i]);//更新ans1

}for(int i=1;i<=n;i++)

ans2=max(ans2,f[i]);//更新ans2

}printf("%d\n%d\n",ans1,ans2);

}

下面是運用二分法的演算法,我們可以模擬乙個stack

在有大量資料的情況下,這演算法效率極高

但是,怎麼來優化程式呢?

我們可以這樣來模擬:

每輸入乙個數,如果這個數大於棧頂的那個數,於是把它推入棧中。但是,如果這個數大於棧頂呢,這不證明它不可以更新棧中的

某個元素,這時,就可以運用二分查詢了。

有人可能會問:這個序列是無序的啊。沒錯,但查詢的是stack裡面的元素,而這個棧裡的所有元素,都是嚴格遞增的,所以,用二分查詢可以把問題縮減為o(nlogn)。
#include#include#includeusing namespace std;

const int maxn=100005;

int a[maxn];

int f[maxn];

int main()

else

}if(l!=0)f[l]=a[i];}}

cout<=a[i])r=mid;

else

}f[l]=a[i];}}

cout《最後說下這道題用樹狀陣列和線段樹也可以做到o(logn),但是本菜雞不會(逃)

飛彈攔截(dp 最長不上公升子串行)

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

攔截飛彈(最長上公升子串行,最長不上公升子串行)

攔截飛彈 noip 1999 題目描述 張琪曼 老師,修羅場是什麼?墨老師 修羅是佛家用語,修羅畢生以戰鬥為目標,修羅場指的是他們之間的死鬥坑,人們通常用 修羅場 來形容慘烈的戰場。後來又引申出 乙個人在困境中做絕死奮鬥 的意思。所以,這其實也在暗示我們,即使是身處絕境,也不要放棄奮鬥。再說了,情況...

飛彈攔截(最長非上公升子串行和最長上公升子串行)

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