[AcWing] 1010. 拦截导弹(C++实现)最长上升子序列模型+贪心

1. 题目

在这里插入图片描述
在这里插入图片描述

2. 读题(需要重点注意的东西)

读题:
每来一个导弹有两种选择:

  1. 接在现有某个导弹拦截系统之后

  2. 创建一个新的导弹拦截系统

我们希望一个导弹拦截系统拦截的导弹足够的多贪心),那么如果要将这个导弹加到某一个导弹拦截系统之后的话,我们需要从现有的所有导弹拦截系统中,找到一个结尾大于当前导弹高度的最小的数;如当前导弹高度为 200,现有系统如下:

  • 系统1:500 300 210

  • 系统2:450 350 220

  • 系统3:400 380 230

  • 系统4:400 380 199

210是结尾大于200的最小的数,我们就要将它加到210的后面,也就是加到系统1中,即:

  • 系统1:500 300 210 200

思路:
最长上升子序列 + 贪心
在这里插入图片描述
本题有两问:
第一问就是求最长上升子序列

第二问是求需要多少个导弹拦截系统:

  • 如果当前导弹的高度能放到某个系统后(找到一个结尾大于当前导弹高度的最小的数),则放在其系统后;

  • 如果所有的结尾都小于当前的导弹高度,则开一个新的系统

优化: 从前往后枚举所有子序列的结尾,因为子序列的结尾的数是单调上升的,所以只要枚举到比自己大的第一个数就可以直接替换掉这个比自己大的数

3. 解法

---------------------------------------------------解法---------------------------------------------------

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cloudeeeee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值