当前位置:首页 > 题解目录 > 正文内容

【题解】导弹拦截

亿万年的星光3年前 (2022-10-21)题解目录2677

【题目描述】

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹的枚数和导弹依次飞来的高度(雷达给出的高度数据是不大于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;
}



扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

标签: 动态规划
分享给朋友:

相关文章

字符全排列

【题目描述】给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。我们假设对于小写字母有‘a’ <‘b’ < … <‘y’<‘z’,而且给定的字符串中的字母已经按照...

【题解】括号匹配问题

【题目描述】在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括...

【题解】数字的选择

【题目描述】有n个非负整数,请从这n个非负整数中,选出m个数,在不改变m个数的顺序的情况下,构成一个新数列,要求该数列的中相邻两个数的差值绝对值的和尽可能小。请问,这个最小的差值绝对值的和是多少?比如...

【题解—深搜】马走日

【题解—深搜】马走日

【题目描述】马在中国象棋以日字形规则移动。请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。【输入】第一行为整...

【题解】特殊的质数肋骨

【题目描述】农民约翰母牛总是产生最好的肋骨。你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组...

【题解】单词排序

【题目描述】输入一行单词序列,相邻单词之间由一个或者多个空格间隔,请按照字典序输出这些单词,要求重复的单词只输出一次。(区分大小写)【输入描述】一行单词序列,最少一个单词,最多100个单词,每个单词长...