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;
}
*****************************************************************************************仅供吐槽