导弹拦截问题

信息学奥赛一本通题目解析:1322:【例6.4】拦截导弹问题(Noip1999) 【题目描述】某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度不大于30000的正整数)。计算要拦截所有导弹最小需要配备多少套这种导弹拦截系统。【输入】n颗依次飞来的高度(1≤n≤1000)。【输出】要拦截所有导弹最小配备的系统数k。【输入样例】 阅读详情

问题描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:**虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。**某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输入格式

一行,为导弹依次飞来的高度

输出格式

两行,分别是最多能拦截的导弹数与要拦截所有导弹最少要配备的系统数

样例输入

389 207 155 300 299 170 158 65

样例输出

6
2

思路详解

首先这个输入就比较坑。我习惯了先输入一个n,然后接下来的1行里面有n个数。这样的输入,得找到边界条件并且正确t统计输入的个数。

//输入
//181 205 471 782 1033 1058 1111
int n=1;
    //把n个数都输入进去
    while(scanf("%d",&a[n])!=EOF){
        if(getchar()=='\n')
            break;//如果输入换行,则退出
        n++;//如果不是,继续输入下一个导弹得高度
    }

接下来分析第二个问题,最多能够拦截导弹的数量。
这相当于1个序列里面,按照先后顺序挑选出最多的元素使得这个挑选出来的序列是非递增的。这也是最经典的最长非递增子序列问题,可用动态规划求解。对于每一个数组元素,可设置从第一个导弹到当前位置能够拦截的最大导弹数目为1,那么从第二个导弹开始往后遍历,如果后面的导弹的高度比前面某一个的高度要低,那么当前拦截导弹的数目可能是前面这一个的拦截数目+1,从而可以得到递推方程b[i]=max{b[i],b[j]+1}(j<=i&&a[j]>=a[i])。

int getLIS(int n)
{
    for(int i=1;i<=n;i++)
        b[i]=1;
    for(int i=2;i<=n;i++){
        for(int j=1;j<=i-1;j++){
            if(a[i]<=a[j]){
                b[i]=max(b[i],b[j]+1);
            }
        }
    }
    int max=b[1];
    for(int i=2;i<=n;i++)
      if(max<b[i])
         max=b[i];
    return max;
}

最后,从得到的b数组中挑选出最大值,即为当前数组的最长非递增子序列的长度。

第三个问题,求需要的最小的导弹拦截系统数目。这里用到贪心算法。贪心策略为,当前导弹来临时,用能够拦截它的拦截高度最低的拦截系统来拦截它,因为这样拦截系统付出的代价最小(导弹拦截系统拦截导弹后,拦截高度变小了,当然是希望用相对拦截高度最低的去拦截)。如所有系统都不能拦截,则增加一个导弹拦截系统。

int minSystem(int n)
{
    m[1]=a[1];//第一个导弹拦截系统
    int k=1;//导弹拦截系统的数目
    for(int i=2;i<=n;i++){
        int flag=0;//用来标记
        for(int j=1;j<=k;j++){
            if(a[i]<=m[j])//说明可以拦截
            {
                if(flag==0)//说明这是可以拦截的第一个系统
                    flag=j;
                if(flag!=0&&m[flag]>=m[j])
                    flag=j;
            }
        }
        if(flag==0)//说明没有系统可以拦截
        {
            k++;
            m[k]=a[i];
        }
        else{
            //可以拦截,更新代价最小的系统
            m[flag]=a[i];
        }
    }
    return k;
}

AC源代码

#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int a[100001];//存放导弹高度
int b[100001];//存放当前最长非递增子序列长度
int m[100001];//存放导弹拦截系统的拦截高度
//求两个数中的最大值
int max(int x,int y)
{
    if(x>=y)
        return x;
    else
        return y;
}
//求一个数组中的最长非递增子序列
int getLIS(int n)
{
	//b[i]表示从第一个元素到第i个元素的最长非递增子序列的长度。
    for(int i=1;i<=n;i++)
        b[i]=1;
    //动态规划
    //b[i]=max{b[i],b[j]+1}(j<i&&a[j]>=a[i])
    for(int i=2;i<=n;i++){
        for(int j=1;j<i;j++){
            if(a[i]<=a[j]){
                b[i]=max(b[i],b[j]+1);
            }
        }
    }
    //求b数组的最大值,即为整个a数组的最长非递增子序列的长度
    int max=b[1];
    for(int i=2;i<=n;i++)
      if(max<b[i])
         max=b[i];
    return max;
}
int minSystem(int n)
{
    m[1]=a[1];//第一个导弹拦截系统
    int k=1;//导弹拦截系统的数目
    for(int i=2;i<=n;i++){
        int flag=0;//用来标记
        for(int j=1;j<=k;j++){
            if(a[i]<=m[j])//说明可以拦截
            {
                if(flag==0)//说明这是可以拦截的第一个系统
                    flag=j;
                if(flag!=0&&m[flag]>=m[j])//如果不是第一个拦截系统但是比拟打算拦截这个导弹的系统的拦截高度还要低
                    flag=j;//更新flag
            }
        }
        if(flag==0)//说明没有系统可以拦截
        {
            k++;//再增加一个拦截系统
            m[k]=a[i];//拦截系统的高度就是当前导弹的高度
        }
        else{
            //可以拦截,更新代价最小的系统
            m[flag]=a[i];
        }
    }
    return k;
}
int main()
{
    int n=0;
    char ch;
    //把n个数都输入进去
    while(scanf("%d",&a[n])!=-1){
        n++;
        ch=getchar();
        if(ch=='\n')
            break;
    }
    cout<<getLIS(n)<<endl;
    cout<<minSystem(n);
    return 0;
}

其他数据

样例输入2:

181 205 471 782 1033 1058 1111

样例输出2:

1
7

在这里插入图片描述

XYNUOJ 1250: 导弹拦截问题—贪心算法 欢迎访问XYNUOJ 1250: 导弹拦截问题(NOIP1999)需要系统个数 时间限制: 1 Sec  内存限制: 128 MB 提交: 8  解决: 3 [提交][状态][讨论版][Edit] [TestData] 题目描述  某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发 阅读详情

相关推荐

【DP经典问题】导弹拦截(一定要好好理解)

【问题描述】 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。   输入导弹的枚数和导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,每个数据之间有一个空格),计算...

weixin_44341982的博客 2993

P1020 [NOIP1999 普及组] 导弹拦截

题目描述 题目描述  某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。  输入导弹依次飞来的高度(雷达给出的高度数据是\le 50000≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。  题目来源 解题思路  狄尔沃斯定理(Dilw

少年的博客 2213

动态规划之导弹拦截问题

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数) 1.计算一套系统最多能拦截多少导弹? 2.如果要拦截所有导...

qq_46169325的博客 1690

东华大学2020考研计算机OJ题目解答分享——进阶篇(47)

47 最少拦截系统 作者: xxx时间限制: 1S章节: 一维数组 问题描述 : 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能达到前一发的高度。 某天,雷达捕捉到敌国的导弹来袭,如果系统数量太少,将导致有可能不能拦截所有的导弹。所以,根据雷达捕捉到的导弹高度,需要预先准备相应数量的拦截系统。 比如...

qq_38344326的博客 785

一本通1322拦截导弹问题(贪心)

1322拦截导弹问题(Noip1999) 【题目描述】 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度不大于30000的正整数)。计算要拦截所有导弹最小...

聽竹風的博客 1274

洛谷 : P1020 [NOIP1999 普及组] 导弹拦截

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度,计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。...

小天狼星_布莱克 的博客 2534

最少拦截系统(DP两种写法&详细解析)

最少拦截系统 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统. Input 输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达.

m0_58245389的博客 3879

绿标短网址app.10086.cn/xxxxx移动短网址缩短接口网址api调用php方式解析

绿标短网址app.10086.cn/xxxxx 移动网缩短接口网址api调用php方式解析 app.10086.cn是移动网站的接口,可以制作移动网等第三方官方网站域名的任意生成接口,由于是认证企业,可以再抖音 微信 qq等第三方渠道正常打开不拦截提示,第三方网址,头条文章等,效果非常号,这里记录下api接口,纯技术php生成,具体规则可以去抖音的开放平台去申请对应接口 。这里用我php模拟抓包获取方式 GET http://www.app10086cn.cn/?i=app.10068.cnHTTP/1.1

qq_20300095的博客 5911

拦截导弹问题(Noip1999)

1322:【例6.4】拦截导弹问题(Noip1999) 时间限制: 1000 ms 内存限制: 65536 KB提交数: 3843 通过数: 1373 【题目描述】 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该...

weixin_30872157的博客 832

SPSS与SPSS Modeler,不一样的世界

1. SPSS软件的前世今生 1.1 IBM SPSS的由来 与数据打过交道的小伙伴们,应该对SPSS软件都不陌生。SPSS是世界上最早的统计分析软件,由斯坦福大学的三个研究生大牛于1968年研发,同时还成立了SPSS公司。SPSS最初的全称是Solutions Statistical Package for the Social Sciences(社会科学统计软件包),随着SPSS产品服务领...

qq_24339451的博客 3613

无线充电效率从75%到90%+:深入拆解LCC补偿网络如何成为电动汽车和智能车竞赛的‘稳压器’

本文深入探讨了LCC补偿网络如何显著提升无线充电效率至90%以上,成为电动汽车和智能车竞赛中的关键技术。通过分析LCC的三元件结构和双模式切换特性,揭示了其在负载突变和线圈错位情况下的稳定性优势,并展示了实际应用中的效率提升和产业化挑战。

weixin_42528191的博客 399

一本通 拦截导弹问题(Noip1999)+拦截导弹(Noip1999)+拦截导弹 三题题解

第一题【1322:【例6.4】拦截导弹问题(Noip1999)】 【题目描述】 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度不大于30000的正整数)。计算要拦截所有导弹最小需要配备多少套这种导弹拦截系统。 【输入】 n颗依次飞来的高度(1≤n≤

absWC的博客 3485

架构决策之消息中间件MQ系列六-Pulsar

一、架构

恰恰虎的博客 7254

导弹拦截问题ACM

/************************************************************************//*FileName:导弹拦截问题/*Author:PenglueR/*Date:2009/07/23/*Comment:Problem description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它

积累与分享 2929

SOC Boot学习(二)——JTAG Debug介绍

JTAG(Joint Test Action Group ,联合测试行动小组 ) 是一种国际标准测试协议,主要用于芯片内部测试及对系统进行仿真、调试。JTAG 技术是一种嵌入式调试技术,它在芯片内部封装了专门的测试电路 TAP ( Test Access Port ,测试访问口),通过专用的 JTAG 测试工具对内部节点进行测试。如今大多数比较复杂的器件都支持 JTAG 协议,如 ARM 、 DSP 、 FPGA 器件等。

yttt的博客 1610

暗黑地牢modfiles.txt文件生成工具

暗黑地牢modfiles.txt文件生成工具引言方法工具源码基本步骤 引言 玩过暗黑地牢mod,并手动修改了mod中文件的话,如果不同步修改modfiles.txt文件,就会引起各种问题,典型的比如马车刷不出mod英雄,商店和boss都不再出现mod饰品,怪物贴图丢失出现黑块等,要解决这个问题,就要修正mod文件夹下的modfiles.txt文件 方法 针对修改量大小,一般有几种方法: 如果修改较少,而且你还记得修改了哪几个文件,找到这几个文件,右键属性,查看大小,要用的是括号里面的字节数,然后打开mod

lttclaw_的专栏 5006

【动态规划】拦截导弹问题/C++/附源码/简单经典算法

拦截导弹问题 题目内容: 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。 输入格式: 第一行,输入雷...

mountains_L的博客 3254

Linux内核驱动模型--PCIe(PCI Express)驱动​​

本文系统介绍了Linux内核中PCIe驱动的设计与实现。首先从架构定位入手,指出PCIe驱动基于PCI子系统扩展支持高速、低功耗特性。核心数据结构struct pci_driver包含设备匹配表id_table、生命周期函数probe/remove等关键组件。文章详细解析了驱动与设备的绑定流程、资源管理机制,并重点阐述了MSI-X中断、电源管理、热插拔和多队列等高级特性实现方案。最后提供了lspci、dmesg等调试工具的使用方法,总结了PCIe驱动在支持高性能设备中的关键作用。全文通过架构设计、核心结构、

amy_mhd的博客 429

算法:拦截导弹问题

拦截导弹问题(20分): 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。 输入格式: 第一行,输入雷...

juliet0727的博客 1738

cadence17.4和16.6同时安装无法使用的问题

经过对报错的问题分析,发现还是17.4的lic文件和16.6的不一样,16.6的版本总是无法找到自己对应的lic文件。卸载了,重新单独安装16.6,这里就是正确的。包括使用这些工具去修复这些问题,都无法接近。已经放弃了,使用哪个版本就安装 哪个版本。这个也无法解决问题。

D_Katter的博客 2326

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

动态规划解导弹拦截问题

动态规划解导弹拦截问题 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。 输入格式 1行,若干个整数(个数≤100000) 输出

qq_41117896的博客 1779

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【贪心算法】拦截导弹问题

以前有点懒,所以最近勤更。

jiaomoxuan的博客 429

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

dp求解导弹拦截问题

Problem某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够达到任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在使用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 Input最多20个整数,分别表示导弹依次飞来的高度(雷达给出高度数据是不大于30000的正整数) Output两个...

小龙虾 633
上一篇: 最优分解问题贪心求解
下一篇: 算法训练 乘积最大
practical_sharp
博客等级 码龄8年 499粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值