算法(蓝桥杯)贪心算法4——拦截导弹的系统数量求解

news2025/1/18 4:17:52

 题目描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。

假设某天雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

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

比如:有 8 颗导弹,飞来的高度分别为

389 207 175 300 299 170 158 165

那么需要 2 个系统来拦截,他们能够拦截的导弹最优解分别是:

系统 11 :拦截 389 207 175 170158158

系统 22 :拦截 300 299 165

输入

两行,第一行表示飞来导弹的数量 n(n≤1000);

第二行表示 n 颗依次飞来的导弹高度;

输出

要拦截所有导弹最小配备的系统数 k 。

样例

 

知识点

贪心算法

过程逻辑:

代码

n=int(input())
a=[int(i) for i in input().split()]
b=[0]*1010
k=0
for i in range(n):
    p = -1
    for j in range(k):
        if a[i]<=b[j]:
            p=j
            break
    if (p == -1):
        b[k] = a[i]
        k += 1
    else:
        b[p] = a[i]
print(k)

 代码解析

这道题包含了能拦截和不能拦截两种情况,不能拦截就要加多一个系统,能拦截指的是所有的系统里面有一个能拦截就能拦截;一开始最容易想到来判断我上面说的能不能拦截的条件就是目前的导弹发射高度是否大于上一个的高度,但是这个想法是不准确的,能不能拦截这个问题是动态的,可能第一个系统不能,但是第二个系统就能了,所以仅仅通过a[i]与b[j]的大小判断来作为能不能拦截的条件是不准确的,此处引入p来作为能不能拦截的条件变量,通过循环遍历每套系统拦截的最高高度数组,判断每一个系统是否能够拦截当前导弹。

扩展 

改变输出样例:

 题解

(一)输入部分

Python复制

n = int(input())
a = [int(i) for i in input().split()]
  1. n = int(input()):读取用户输入的一个整数n,表示整数序列的长度。

  2. a = [int(i) for i in input().split()]:读取用户输入的一行数据,使用input().split()将输入的字符串按空格分割成多个子字符串,然后通过列表推导式将这些子字符串转换为整数,构成一个整数列表a。

(二)初始化部分

Python复制

b = [0] * 1010
k = 0
c = []
  1. b = [0] * 1010:初始化一个长度为1010的列表b,用于存储当前最长递增子序列的末尾元素。1010是一个足够大的数,确保不会溢出。

  2. k = 0:初始化一个计数器k,用于记录当前最长递增子序列的长度。

  3. c = []:初始化一个空列表c,用于记录每个元素在最长递增子序列中的位置和值。

(三)动态规划部分

Python复制

for i in range(n):
    p = -1
    for j in range(k):
        if a[i] <= b[j]:
            p = j
            break
    if p == -1:
        b[k] = a[i]
        c.append([k, a[i]])
        k += 1
    else:
        b[p] = a[i]
        c.append([p, a[i]])
  1. for i in range(n)::通过一个循环,遍历输入的整数序列a。

  2. p = -1:初始化一个变量p为-1,用于记录当前元素a[i]在b中的插入位置。

  3. for j in range(k)::通过一个内层循环,遍历当前最长递增子序列的末尾元素列表b。

    • if a[i] <= b[j]::如果当前元素a[i]小于或等于b[j],则找到插入位置。

      • p = j:将插入位置记录为j。

      • break:跳出内层循环。

  4. if p == -1::如果p仍为-1,说明当前元素a[i]可以扩展最长递增子序列。

    • b[k] = a[i]:将a[i]添加到b的末尾。

    • c.append([k, a[i]]):记录当前元素的位置和值。

    • k += 1:更新最长递增子序列的长度。

  5. else::如果p不为-1,说明当前元素a[i]可以替换b中的某个元素。

    • b[p] = a[i]:将b[p]更新为a[i]。

    • c.append([p, a[i]]):记录当前元素的位置和值。

(四)排序与分组部分

Python复制

# 按照第二个元素排序
array = sorted(c, key=lambda x: x[0])
# 初始化一个字典用于存储分类后的数据
data_dict = {}
# 遍历排序后的数组
# 遍历数组,根据第一个元素进行分组
for item in array:
    key = item[0] + 1  # 将第一个元素加1作为字典的键
    value = item[1]    # 第二个元素作为值
    if key in data_dict:
        data_dict[key].append(value)
    else:
        data_dict[key] = [value]
  1. array = sorted(c, key=lambda x: x[0]):按照每个子列表的第一个元素(即位置)对列表c进行排序。

  2. data_dict = {}:初始化一个字典data_dict,用于存储分类后的数据。

  3. for item in array::遍历排序后的列表array。

    • key = item[0] + 1:将每个子列表的第一个元素加1作为字典的键。

    • value = item[1]:将每个子列表的第二个元素作为值。

    • if key in data_dict::如果键已经存在于字典中,将值添加到对应的列表中。

    • else::如果键不存在于字典中,创建一个新的列表并添加值。

(五)输出部分

Python复制

# 按照指定的格式输出
print(k)
for key, values in data_dict.items():
    print(f"{key}:{' '.join(map(str, values))}")
  1. print(k):输出最长递增子序列的长度。

  2. for key, values in data_dict.items()::遍历字典data_dict。print(f"{key}:{' '.join(map(str, values))}"):按照指定的格式输出每个位置上的元素。其中,map(str, values)将值列表中的每个元素转换为字符串,' '.join(...)将这些字符串用空格连接起来。

完整代码 
n=int(input())
a=[int(i) for i in input().split()]
b=[0]*1010
k=0
c=[]
for i in range(n):
    p = -1
    for j in range(k):
        if a[i]<=b[j]:
            p=j
            break
    if (p == -1):
        b[k] = a[i]
        c.append([k,a[i]])
        k += 1
    else:
        b[p] = a[i]
        c.append([p,a[i]])
# 按照第二个元素排序
array = sorted(c, key=lambda x: x[0])
# 初始化一个字典用于存储分类后的数据
data_dict = {}
# 遍历排序后的数组
# 遍历数组,根据第一个元素进行分组
for item in array:
    key = item[0] + 1  # 将第一个元素加1作为字典的键
    value = item[1]    # 第二个元素作为值
    if key in data_dict:
        data_dict[key].append(value)
    else:
        data_dict[key] = [value]
# 按照指定的格式输出
print(k)
for key, values in data_dict.items():
    print(f"{key}:{' '.join(map(str, values))}")

总结

这段代码通过动态规划的方法计算了最长递增子序列的长度,并记录了每个元素在最长递增子序列中的位置。最后,按照特定格式输出每个位置上的元素。这种处理方式在处理动态规划问题时非常实用,特别是在处理最长递增子序列这类问题时,可以高效地找到解决方案并输出详细的结果。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2278288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一些常见的Java面试题及其答案

Java基础 1. Java中的基本数据类型有哪些&#xff1f; 答案&#xff1a;Java中的基本数据类型包括整数类型&#xff08;byte、short、int、long&#xff09;、浮点类型&#xff08;float、double&#xff09;、字符类型&#xff08;char&#xff09;和布尔类型&#xff08;boo…

初学stm32 --- CAN

目录 CAN介绍 CAN总线拓扑图 CAN总线特点 CAN应用场景 CAN物理层 CAN收发器芯片介绍 CAN协议层 数据帧介绍 CAN位时序介绍 数据同步过程 硬件同步 再同步 CAN总线仲裁 STM32 CAN控制器介绍 CAN控制器模式 CAN控制器模式 CAN控制器框图 发送处理 接收处理 接收过…

Golang笔记——协程同步

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Golang的协程同步的实现和应用场景。 文章目录 协程同步是什么&#xff1f;为什么需要协程同步&#xff1f;常见的协程同步机制互斥锁&#xff0…

Visual Studio Community 2022(VS2022)安装方法

废话不多说直接上图&#xff1a; 直接上步骤&#xff1a; 1&#xff0c;首先可以下载安装一个Visual Studio安装器&#xff0c;叫做Visual Studio installer。这个安装文件很小&#xff0c;很快就安装完成了。 2&#xff0c;打开Visual Studio installer 小软件 3&#xff0c…

目标检测新视野 | YOLO、SSD与Faster R-CNN三大目标检测模型深度对比分析

目录 引言 YOLO系列 网络结构 多尺度检测 损失函数 关键特性 SSD 锚框设计 损失函数 关键特性 Faster R-CNN 区域建议网络&#xff08;RPN&#xff09; 两阶段检测器 损失函数 差异分析 共同特点 基于深度学习 目标框预测 损失函数优化 支持多类别检测 应…

mac intel芯片下载安卓模拟器

一、调研 目前主流两个模拟器&#xff1a; 雷神模拟器 不支持macosmumu模拟器pro版 不支持macos intel芯片 搜索到mumu的Q&A中有 “Intel芯片Mac如何安装MuMu&#xff1f;” q&a&#x1f517;&#xff1a;https://mumu.163.com/mac/faq/install-on-intel-mac.html 提…

发送dubbo接口

史上最强&#xff0c;Jmeter接口测试-dubbo接口实战&#xff08;超级详细&#xff09;_jmeter调用dubbo接口-CSDN博客 干货分享&#xff1a;Dubbo接口及测试总结~ 谁说dubbo接口只能Java调用&#xff0c;我用Python也能轻松搞定 telnet xxx.xxx.xxx.xxx 端口号 再回车显示dub…

Leetcode 91. 解码方法 动态规划

原题链接&#xff1a;Leetcode 91. 解码方法 自己写的代码&#xff1a; class Solution { public:int numDecodings(string s) {int ns.size();vector<int> dp(n,1);if(s[n-1]0) dp[n-1]0;for(int in-2;i>0;i--){if(s[i]!0){string ts.substr(i,2);int tmpatoi(t.c…

SpringBoot源码解析(七):应用上下文结构体系

SpringBoot源码系列文章 SpringBoot源码解析(一)&#xff1a;SpringApplication构造方法 SpringBoot源码解析(二)&#xff1a;引导上下文DefaultBootstrapContext SpringBoot源码解析(三)&#xff1a;启动开始阶段 SpringBoot源码解析(四)&#xff1a;解析应用参数args Sp…

SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现

SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现 目录 SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现分类效果基本描述程序设计参考资料 分类效果 基本描述 SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长…

XML在线格式化 - 加菲工具

XML在线格式化 打开网站 加菲工具 选择“XML 在线格式化” 输入XML&#xff0c;点击左上角的“格式化”按钮 得到格式化后的结果

树莓派5--系统问题汇总

前言&#xff1a; 该文章是我在使用树莓派5时所遇到的问题以及解决方案&#xff0c;希望对遇到相同问题的能够有所帮助。我的树莓派系统版本为&#xff1a;Pi-OS-ROS_2024_09_29 注意&#xff1a;如果没有什么需求千万不要更新树莓派中任何软件或者系统&#xff0c;除非你真的…

C#学习笔记 --- 基础补充

1.operator 运算符重载&#xff1a;使自定义类可以当做操作数一样进行使用。规则自己定。 2.partial 分部类&#xff1a; 同名方法写在不同位置&#xff0c;可以当成一个类使用。 3.索引器&#xff1a;使自定义类可以像数组一样通过索引值 访问到对应的数据。 4.params 数…

【2024年华为OD机试】 (C卷,100分)- 免单统计(Java JS PythonC/C++)

一、问题描述 题目描述 华为商城举办了一个促销活动&#xff0c;如果某顾客是某一秒内最早时刻下单的顾客&#xff08;可能是多个人&#xff09;&#xff0c;则可以获取免单。 请你编程计算有多少顾客可以获取免单。 输入描述 输入为 n 行数据&#xff0c;每一行表示一位顾…

python中数据可视化库(Matplotlib)

python中数据可视化库&#xff08;Matplotlib&#xff09; 安装 Matplotlib基本使用绘图类型示例散点图 (Scatter Plot)柱状图 (Bar Chart)饼图 (Pie Chart)直方图 (Histogram) 自定义图表样式多面板图表 (Subplots)3D 图表 Matplotlib 是 Python 中一个非常流行的绘图库&#…

某国际大型超市电商销售数据分析和可视化

完整源码项目包获取→点击文章末尾名片&#xff01; 本作品将从人、货、场三个维度&#xff0c;即客户维度、产品维度、区域维度&#xff08;补充时间维度与其他维度&#xff09;对某国际大型超市的销售情况进行数据分析和可视化报告展示&#xff0c;从而为该超市在弄清用户消费…

DETR论文阅读

1. 动机 传统的目标检测任务需要大量的人工先验知识&#xff0c;例如预定义的先验anchor&#xff0c;NMS后处理策略等。这些人工先验知识引入了很多人为因素&#xff0c;且较难处理。如果能够端到端到直接生成目标检测结果&#xff0c;将会使问题变得很优雅。 2. 主要贡献 提…

工业视觉2-相机选型

工业视觉2-相机选型 一、按芯片类型二、按传感器结构特征三、按扫描方式四、按分辨率大小五、按输出信号六、按输出色彩接口类型 这张图片对工业相机的分类方式进行了总结&#xff0c;具体如下&#xff1a; 一、按芯片类型 CCD相机&#xff1a;采用电荷耦合器件&#xff08;CC…

《机器学习》——TF-IDF(关键词提取)

文章目录 TF-IDF简介TF-IDF应用场景TF-IDF模型模型参数主要参数 TF-IDF实例实例步骤导入数据和模块处理数据处理文章开头和分卷处理将各卷内容存储到数据帧jieba分词和去停用词处理 计算 TF-IDF 并找出核心关键词 TF-IDF简介 TF - IDF&#xff08;Term Frequency - Inverse Do…

LabVIEW与WPS文件格式的兼容性

LabVIEW 本身并不原生支持将文件直接保存为 WPS 格式&#xff08;如 WPS 文档或表格&#xff09;。然而&#xff0c;可以通过几种间接的方式实现这一目标&#xff0c;确保您能将 LabVIEW 中的数据或报告转换为 WPS 可兼容的格式。以下是几种常见的解决方案&#xff1a; ​ 导出…