洛谷P1020导弹拦截(二分)

本文介绍了洛谷P1020导弹拦截问题的解决方案,主要涉及最大上升子序列和最大下降子序列的概念。通过二分查找优化算法,解决了在大数据规模下避免超时的问题,从而求得拦截所有导弹所需的系统套数。
摘要由CSDN通过智能技术生成

题目链接

        P1020 [NOIP1999 普及组] 导弹拦截

题目思路

本题的问题是一套系统最多拦截的导弹数量以及拦截所有导弹需要的系统套数。其实就是求最大上升子序列最大下降子序列

首先看第一个问题,一套系统最多拦截的导弹数量,题目要求一套系统拦截的导弹第一颗可以任意高度,但是之后所拦截的导弹高度不得高于之前拦截的那颗导弹。也就是比如说第一颗拦截的高度为100,之后拦截的导弹高度就不能超过100,可以为100,可以为99,但是不能101。因此这道题就是找到最大下降子序列。

然后看第二个问题,拦截所有导弹需要的系统套数,那也就是求总共有多少个下降子序列,几个下降子序列就是几套。然后,通过狄尔沃斯定理(dilworth)可以知道,要求下降子序列的数量,也就是求最大上升子序列长度。

要求最大上升子序列,我们常规想到的就是用dp[i]=max(dp[i],dp[j]+1),然后套一个双重循环,这样的解原本数据规模为2000的没什么问题,但是这道题将数据规模扩大到了1e5,显而易见,要是使用双重循环会超时,所以我们要优化程序。这时,我们就可以考虑使用二分查找来解决这个问题。

二分思路:

1)先将数组中的第1个元素存到一个新的数组

2)再将原数组剩下的元素与新数组最后一个元素进行比较

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值