【题解】导弹拦截
【题目描述】
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹的枚数和导弹依次飞来的高度(雷达给出的高度数据是不大于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; }
扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。