洛谷1020攔截飛彈(NOIP1999)

2021-08-07 06:59:20 字數 1045 閱讀 9733

洛谷1020攔截飛彈(noip1999)

題目描述

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

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

輸入格式:

一行,若干個正整數最多100個。

輸出格式:2

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

輸入輸出樣例

輸入樣例#1:

389 207 155 300 299 170 158 65

輸出樣例#1:

6  2

分析:

第一問和t1差不多,第二問是個難點,最簡單的辦法是使用定理:乙個序列中不上公升子串行的最小覆蓋數等於子串行中最長上公升序列的長度

#includeusing namespace std;

int n=1,ans1=0,ans2=0;

intf[10005]=,g[10005]=,a[10005];

int main()

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

for(int j=1;j<=i;j++)

if(a[j]>a[i])f[i]=max(f[i],f[j]+1);

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

for(int j=1;j<=i;j++)

if(a[j]ans1)ans1=f[i];

if(g[i]>ans2)ans2=g[i];

// printf("%d%d\n",f[i],g[i]);

}cout<

洛谷P1020 NOIP1999 攔截飛彈

題意簡述 求最長不上公升子串行的長度,並求出最少有幾個不上公升子串行。解題思路 第一問直接用dp做,有o n 2 的也有優化後o nlgn 的,我才用的是前者。第二問可以用乙個陣列h來記錄當前所有系統的攔截高度,每次遇到乙個新元素,在h陣列中找乙個大於 a i 的最小的元素,並將其更新為 h j a...

洛谷P1020攔截飛彈題解 zhengjun

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

NOIP 攔截飛彈

題意很簡潔,一共兩問。第一問是求單個攔截系統最多能攔截多少個,根據題意即最長非上公升子串行。第二問有多少飛彈攔截系統才能攔截全部飛彈,即有多少最長非上公升子串行才能包括全部數。稍加思考即可得出最長上公升子串行的長度即為答案。本題的轉化思考和兩個求序列長度寫法要記一下 就我目前看到的題解貌似沒人這麼寫...