飛彈攔截 p1020

2022-04-12 06:54:35 字數 1154 閱讀 9932

第一問就是求最長不上公升子串行的長度,要寫o(nlogn)的演算法。。。。

對於這種nlogn的演算法,只能求出長度,不能求出具體的序列。這種演算法實現過程如下:

我們定義len為到目前為止最長不上公升子串行的長度,d[l]表示此長度為l的不上公升子串行的末尾資料中最下的那個,a[i]為輸入的第i個結果。先使d[1]=a[1],len=1。我們從i=2(i<=n)開始看:

如果a[i]<=d[len],那麼使d[++len]=a[i],即擴充一下目前的最長不上公升子串行;

否則,a[i]>d[len],就在陣列d中從前往後找到第乙個<a[i]的元素d[j],此時d[i1,2,...,j-1]都>=a[i],那麼它完全可以接上d[j-1]然後生成乙個長度為j的不上公升子串行,而且這個子串行比當前的d[j]這個子串行更有潛力(因為這個數比d[j]大),所以就替換掉它就行了。

第二問可由dilworth定理知該問是求最長上公升子串行的長度。思路與第一問一模一樣。

不上公升子串行的覆蓋數=最長上公升子串行的長度。

#include#include

#include

#include

#include

using

namespace

std;

int a[1000000],d[1000000

];void

bss();

void

ss();

intn;

intmain()

bss();

ss();

return0;

}void bss() //

求最長不上公升子串行}}

cout

}void ss() //

求最長不下降子串行}}

}cout

<

}

參考一下

P1020 飛彈攔截

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

P1020 飛彈攔截

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

P1020 飛彈攔截

原題鏈結 貪心 記錄每套系統攔截過的最小高度 新來的飛彈 如果高於所有飛彈的最低高度 那就只能再加一套了嘛 如果低於某些系統的最低高度 那就貪心 把它加到 最低高度最低的一套系統內 include include include include include include include inc...