1044 攔截導彈
時間限制: 1 s
空間限制: 128000 KB
題目等級 : 黃金 Gold
題解
查看運行結果
題目描述 Description
某國爲了防禦敵國的導彈襲擊,發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈。
輸入描述 Input Description
輸入導彈依次飛來的高度(雷達給出的高度數據是不大於30000的正整數)
輸出描述 Output Description
輸出這套系統最多能攔截多少導彈,如果要攔截所有導彈最少要配備多少套這種導彈攔截系統。
樣例輸入 Sample Input
389 207 155 300 299 170 158 65
樣例輸出 Sample Output
6
2
數據範圍及提示 Data Size & Hint
導彈的高度<=30000,導彈個數<=20
*****************************************************注意值的初始化和height值的重置
*****************************************************兩個問題是求最長上升和最長下降子序列的問題
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int missile[21] , f[21];
int main()
{
<span style="white-space:pre"> </span>int i = 1,n = 0,j,max = 0;
<span style="white-space:pre"> </span>while(cin>>missile[i++])
<span style="white-space:pre"> </span> n++;
<span style="white-space:pre"> </span>for(i = 1; i <= n; i++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>cin>>missile[i];
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>f[n] = 1;
<span style="white-space:pre"> </span>for(i = n-1; i >= 1; i--)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>max = 0;
<span style="white-space:pre"> </span>for(j = i+1; j <= n; j++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>if(missile[j] < missile[i] && f[j] > max)
<span style="white-space:pre"> </span>max = f[j];
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>f[i] = max + 1;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>sort(f,f+n+1);
<span style="white-space:pre"> </span>cout<<f[n]<<endl;
/*<span style="white-space:pre"> </span>int sum = 0,height = 30001;
<span style="white-space:pre"> </span>bool v[21];
<span style="white-space:pre"> </span>memset(v,0,sizeof(v));
<span style="white-space:pre"> </span>bool flag = false;
<span style="white-space:pre"> </span>while(!flag)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>height = 30001; //每次都是任意高度開始!!
<span style="white-space:pre"> </span> for(i = 1; i <= n; i++)
<span style="white-space:pre"> </span> {
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>if(!v[i] && missile[i] < height)
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>v[i] = 1;
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>height = missile[i];
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> if(height == 30001) break;
<span style="white-space:pre"> </span> else sum++;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>cout<<sum<<endl;
*/
*********************************************求最長不降子序列(上升多少次,就要多少套裝置)
memset(f,0,sizeof(f));
f[n] = 1;
<span style="white-space:pre"> </span>for(i = n-1; i >= 1; i--)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>max = 0;
<span style="white-space:pre"> </span>for(j = i+1; j <= n; j++)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>if(missile[i] < missile[j] && f[j] > max)
<span style="white-space:pre"> </span> max = f[j];
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>f[i] = max + 1;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>sort(f,f+n+1);
<span style="white-space:pre"> </span>cout<<f[n]<<endl;
<span style="white-space:pre"> </span>return 0;
}
*****************************************************************************************僅供吐槽