問題 D: 攔截導彈 簡單版
時間限制: 1 Sec 內存限制: 128 MB
提交: 15 解決: 5
[提交][狀態][討論版][命題人:add_lyf]
題目描述
某國爲了防禦敵國的導彈襲擊,發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈。
輸入導彈依次飛來的高度(雷達給出的高度數據是不大於30000的正整數,導彈數不超過1000),計算這套系統最多能攔截多少導彈,如果要攔截所有導彈最少要配備多少套這種導彈攔截系統。
輸入
輸入有兩行,
第一行,輸入雷達捕捉到的敵國導彈的數量k(k<=25),
第二行,輸入k個正整數,表示k枚導彈的高度,按來襲導彈的襲擊時間順序給出,以空格分隔。
輸出
第一行爲最多能攔截的導彈數;
第二行爲要攔截所有導彈最少要配備的系統數
樣例輸入
8 389 207 155 300 299 170 158 65
樣例輸出
6 2
最多能攔截的導彈數:最長下降子序列
要攔截所有導彈最少要配備的系統數:不斷更新系統的高度,直到所有系統高度都比當前導彈高度小,增加系統數
注意等號時導彈能攔截,系統數不需要增加
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
int k,h[3000],ans,dp1[3000],dp2[3000],sy,j;
int main()
{
while(cin>>k)
{
for(int i=0;i<k;i++)
cin>>h[i];
ans=0;
for(int i=0;i<k;i++)
{
dp1[i]=1;
for(int j=0;j<i;j++)
if(h[j]>=h[i])
dp1[i]=max(dp1[i],dp1[j]+1);
ans=max(ans,dp1[i]);
}
sy=1;
dp2[0]=h[0];
for(int i=1;i<k;i++)
{
for(j=0;j<sy;j++)
if(h[i]<=dp2[j])
{
dp2[j]=h[i];
break;
}
if(j>=sy)dp2[sy++]=h[i];
}
cout<<ans<<endl;
cout<<sy<<endl;
}
return 0;
}