第一問就是求最長不上公升子串行的長度,要寫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...