【题解】导弹拦截
【题目描述】
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹的枚数和导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,每个数据之间至少有一个空格),计算这套系统最多能拦截多少导弹。
【输入描述】
第1行有1个整数n,代表导弹的数量。(n<=1000)
第2行有n个整数,代表导弹的高度。(雷达给出的高度数据是不大于30000的正整数)
【输出描述】
第一行:最多能拦截的导弹数;
第二行:要拦截所有导弹最少要配备的系统数。
【样例输入】
8 389 207 155 300 299 170 158 65
【样例输出】
6
【参考答案一】:只有第一个问题的解
#include<bits/stdc++.h>
using namespace std;
int a[30001],n,c;
//拦截的当前导弹的编号,拦截的数量,当前的高度
void dp(int i,int num,int h){
if(i>n) return;
//比较出最大值
c = max(c,num);
//向后递归
for(int k=i+1;k<=n;k++){
//如果高度 >= 当前导弹高度,则递归
if( h >= a[k]){
dp(k,num+1,a[k]);
}else{
dp(k,num,h);
}
}
}
int main(){
int i;
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i];
}
//每个导弹都可能成为第一枚
for(i=1;i<=n;i++){
dp(i,1,a[i]);
}
cout<<c;
return 0;
}【参考答案二】:两个问题的解都有
#include<bits/stdc++.h>
using namespace std;
int a[1001],b[1001],c[1001];
int main()
{
int n=0,maxx=1;
while(scanf("%d",&a[n++])!=EOF)
for(int i=0;i<n;i++)
{
b[i]=1;
for(int j=0;j<i;j++)
if(a[j]>=a[i]&&b[j]+1>b[i])
b[i]=b[j]+1;
maxx=max(maxx,b[i]);
}
printf("%d\n",maxx);
maxx=1;
for(int i=0;i<n;i++)
{
c[i]=1;
for(int j=0;j<i;j++)
if(a[j]<a[i]&&c[j]+1>c[i])
c[i]=c[j]+1;
maxx=max(maxx,c[i]);
}
printf("%d\n",maxx);
return 0;
}扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。
