1044 攔截導彈

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;
}



*****************************************************************************************僅供吐槽

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章