DP 攔截飛彈 Noip1999

2021-08-15 10:13:16 字數 1442 閱讀 9055

攔截飛彈(noip1999)

時間限制: 1000 ms        記憶體限制: 65536 kb

提交數: 690     通過數:216 

【題目描述】

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

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

【輸入】

輸入飛彈依次飛來的高度。

【輸出】

第一行:最多能攔截的飛彈數;

第二行:要攔截所有飛彈最少要配備的系統數。

【輸入樣例】

389 207 155 300 299 170 158 65

【輸出樣例】

【**】

no題目分析:

第一問典型的最長不下降子串行問題。

第二問,貪心方法,每顆飛彈來襲時,使用能攔截這顆飛彈的的防禦系統的上一次攔截飛彈高度最低的那一套,不存在符合這一條件的系統,使用新的一套。

**實現:

#includeusing namespace std;

int main()

{ int a[1000],h[10000],b[100000];//a為飛彈高度,h記錄

memset(a,0,sizeof(a));

memset(b,0,sizeof(b));

memset(h,0,sizeof(h));

int i=1,j,k,n=0,x,m=0,max=0; //n記錄最多能攔截飛彈,m最少要配備多少套飛彈系統

while(cin>>a[i])

{ max=0; //最長不下降子串行

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

if(a[j]>=a[i]&&b[j]>max)

max=b[j];

b[i]=max+1;

if(b[i]>n) n=b[i];

x=0; //計算由哪一套系統攔截

for(k=1;k<=m;k++)

if(h[k]>=a[i])

if(x==0)

x=k;

else if(h[k]

NOIP1999 攔截飛彈

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

NOIP1999 攔截飛彈

1044 攔截飛彈 1999年noip全國聯賽提高組 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 檢視執行結果 題目描述 description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但...

攔截飛彈noip1999

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