几个人排队,找出这个位置的人前面最近的身高高于他的人的身高

博客讨论了某问题的解法,有人认为是动态规划(DP)问题,但作者觉得维护一个栈才是正解。

为啥都说是dp问题。。

维护一个栈才是正解吧

 

### 问题分析 给定一个排列问题,每个提供一个值 `bi`,表示其左边或右边恰好有 `bi` 个比她。目标是构造一个满足条件的排列,并且要求字典序最小。 这个问题结合了 **排列组合** 和 **贪心算法** 的思想: - **排列组合**:因为需要构造一个满足特定条件的排列。 - **贪心算法**:在构造排列时,采用贪心策略,优先选择字典序最小的可行解。 --- ### 解题思路 #### 1. **理解 `bi` 的含义** 每个提供一个 `bi`,表示其在排列中,左边或右边恰好有 `bi` 个比她。因此,我们需要为每个选择一个位置,并确保满足这个条件。 #### 2. **构造策略** 构造排列时,采用贪心策略: - 从矮到依次安排每个。 - 对于当前身高,尝试将其放置在满足 `bi` 条件的最靠左的位置。 - 在插入时,确保前面或后面有 `bi` 个比她。 #### 3. **实现步骤** 1. 将所有按照身高升序排序。 2. 初始化一个空的排列数组。 3. 对于每个,尝试将其插入到当前排列中满足条件的最左位置。 4. 最终输出排列。 --- ### 代码实现 ```python def reconstruct_sequence(people): # 按照身高升序排序 people.sort() result = [] for h, b in people: # 尝试插入到满足条件的最左位置 count = 0 pos = 0 while pos < len(result): if result[pos] > h: count += 1 if count == b: break pos += 1 result.insert(pos + 1, h) return result ``` --- ### 示例 输入: ```python people = [(1, 0), (2, 1), (3, 0)] ``` 输出: ```python [1, 3, 2] ``` 解释: - 1 的 `bi=0`,表示左边或右边没有比她的,因此放在最前面。 - 2 的 `bi=1`,表示有一个比她的,因此放在最后。 - 3 的 `bi=0`,放在 1 后面。 --- ### 相关问题 1. 如何判断一个排列是否满足给定的 `bi` 条件? 2. 如果 `bi` 表示的是“至少有 `bi` 个比她”,该如何调整构造策略? 3. 如何构造满足条件的字典序最大的排列? 4. 如果允许 `bi` 表示左边和右边同时满足条件,该如何处理? 5. 如何在构造排列时,同时满足 `bi` 和 `ci`(如身高差)的双重约束?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值