題目描述
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。
輸入飛彈依次飛來的高度(雷達給出的高度資料是 ≤
50000
\le 50000
≤50000
的正整數),計算這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。
輸入格式
1
11行,若干個整數(個數 ≤
100000
\le 100000
≤10000
0)輸出格式
2
22行,每行乙個整數,第乙個數字表示這套系統最多能攔截多少飛彈,第二個數字表示如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。
輸入輸出樣例
輸入 #1
389
207155
300299
170158
65
輸出 #16
2
說明/提示
為了讓大家更好地測試n方演算法,本題開啟spj,n方100分,nlogn200分
每點兩問,按問給分
已到典型的動態規劃題。
第一問是求最長不上公升子串行,而第二問是求最長不下降子串行。
第二問可能不好理解,因為如果有兩枚飛彈,第一枚先來,第二枚後來,而第一枚的高度比第二枚低,那麼必須要兩台才行,如果後面還有一枚飛彈比第二枚飛彈還要高,不就要三颱了嗎……以此類推。
#include
#define maxn 100039
using
namespace std;
int a[maxn]
;int f[maxn]
;int
main()
cout<"\n"
; ans=0;
for(i=
1;i<=a[0]
;i++
)f[i]=1
;for
(i=2
;i<=a[0]
;i++
)for
(j=1
;j(a[i]
>a[j]
&&f[i]
) cout
}
下面,還可以優化成200分;
因為我們找到乙個點,就要從它前面的所有點中找符合的點,這樣,我們就可以用乙個陣列記錄這些符合的點,把沒必要優化的路徑省去了。
#include
using
namespace std;
int n=
0,a[
100001
],f[
100001
],d[
100001
],ans=
1,t=0;
intmain()
t=max(t,f[i]);
d[f[i]
]=i;
ans=
max(ans,f[i]);
}printf
("%d\n"
,ans)
; ans=1;
t=0;
for(
int i=
1;i<=n;i++
) t=
max(t,f[i]);
d[f[i]
]=i;
ans=
max(ans,f[i]);
}printf
("%d"
,ans)
;return0;
}
洛谷P1020 飛彈攔截
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...
洛谷 P1020 飛彈攔截
題目大意 對於乙個飛彈攔截系統 它的第一發炮彈能夠攔截任意高度的飛彈,但之後攔截的每一發炮彈都不能高於前一發的高度。輸入n發飛彈依次飛來的高度a i 計算這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。1 n 100 0 a i 30000 題解 p i 表示攔截了第...
洛谷 P1020 飛彈攔截
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...