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

【题解】导弹拦截

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

【题目描述】

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



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

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

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

    相关文章

    【题解】苯小猴

    【题目描述】笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设maxn是单词中出现次数最...

    【题解】大数取模

    【题目描述】求m%n。【输入描述】两个数,m和n。【输出描述】m模n的值。【样例输入】3【样例输出】2【数据范围】对于30%的数据, 1<m<10^18对于70%的数据, m>10^...

    【题解】直方图

    直方图(histogram.cpp)【题目描述】给定一个非负整数数组,统计里面每一个数的出现次数。我们只统计到数组里面最大的数。假设Fmax(Fmax<10000)是数组里最大的数,那么我们只统...

    【题解】柠檬水找零

    【题目描述】在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你...

    【题解】电缆线(2019青岛市程序设计竞赛)

    【问题描述】在郊区有N座通信基站,P条双向电缆,第 i 条电缆连接基站 A_i 和 B_i。特别地,1号基站是通信公司的总站,N号基站位于一座农场中。现在,农场主希望对通信线路进行升级,其中升级第 i...

    【题解】最短距离

    【题目描述】在一条一维的直线上,存在着 n 台显示器和 n 个电源插座。老师给小蓝布置了个任务:负责将每台显示器通过电源线与一个插座相连接(每个插座最多只能给一...