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



*****************************************************************************************仅供吐槽

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值