
dp 最长上升子序列 拦导弹
初始化一个数组 遍历导弹高度数组,对于每个元素,使用二分查找找到其在 最终, 读取输入:使用 初始化变量:读取导弹数量 处理每个元素:对于每个导弹高度 输出结果:最终,
发布日期:2021-05-10 04:59:07
浏览次数:23
分类:精选文章
本文共 1020 字,大约阅读时间需要 3 分钟。
为了解决这个问题,我们需要计算最少需要配备多少套导弹拦截系统。每套系统发射的炮弹高度必须是递减的。因此,我们可以将其转化为寻找最长递减子序列的问题,以确定最少需要的系统数。
方法思路
为了找到最少需要的导弹拦截系统数量,我们可以将其转化为寻找最长递增子序列的问题。每个递增子序列对应一个系统,这样系统数越少,越能覆盖更多的导弹。
具体步骤如下:
tails
,用于记录递增子序列的最小末尾值。tails
中的位置,更新 tails
数组。tails
数组的长度即为所需的系统数。解决代码
import bisectdef main(): import sys input = sys.stdin.read().split() ptr = 0 while ptr < len(input): n = int(input[ptr]) ptr += 1 a = list(map(int, input[ptr:ptr + n])) ptr += n tails = [] for x in a: idx = bisect.bisect_right(tails, x) if idx == 0: tails.insert(0, x) else: tails[idx] = x print(len(tails))if __name__ == "__main__": main()
代码解释
sys.stdin.read
读取所有输入数据,并将其拆分为列表处理。n
和高度数组 a
。x
,使用 bisect.bisect_right
在 tails
数组中找到插入位置。如果位置为 0,直接插入到开头;否则,替换插入位置处的值。tails
数组的长度即为最少需要的导弹拦截系统数量。这种方法利用了二分查找优化,最长递增子序列的时间复杂度为 O(n log n),适用于较大的数据规模。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月16日 09时06分49秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Springboot实现热部署
2019-03-14
composer 介绍、安装及基本使用方法
2019-03-14
PHP 的 ::class 用法
2019-03-14
Python学习之列表用法
2019-03-14
升级qiime2
2019-03-14
Docker 阿里云CentOS 安装
2019-03-14
需求分析
2019-03-14
查找单链表中倒数第k个节点
2019-03-14
linux中rm和rmdir的区别
2019-03-14
JUC源码分析-序章
2019-03-14
面试高频 C++ 知识总结
2019-03-14
小易的升级之路,找出字符串中第一个只出现一次的字符
2019-03-14
创建组出现错误:对COM组件的调用返回了错误 HRESULT E_FAIL。小敏
2019-03-14
数组去重的常用的几种方法
2019-03-14
Linux yum提示Loaded plugins错误的解决方法
2019-03-14
MySQL常见问题解决方案
2019-03-14
npm切换镜像
2019-03-14
算法——203、移除链表元素(力扣)
2019-03-14
算法——102、二叉树的层序遍历(力扣)
2019-03-14
Netty的体系结构及使用
2019-03-14