51NOD 1364 最大字典序排列 贪心+线段树

通过贪心思想解决51NOD题目,保持每次操作后排列首位尽可能大,遇到难题时考虑使用线段树优化,降低复杂度至可接受水平。在维护区间最大值、标记总和和最大值位置的基础上,实现高效求解最大字典序排列。
摘要由CSDN通过智能技术生成

题目链接


题意:
给出 N N N个数的排列,你有 k k k次操作的机会,每次操作可以将相邻的两个数交换位置。
k k k次操作以后,能够得到的字典序最大的排列是什么?


思路:
根据数据范围,排除了动态规划的方向。

通过观察样例和手算几组简单的例子,我们可以发现,排列的第一位应尽可能的大,满足以后再让排列第二位尽可能的大…以此类推可以得到最终满足条件的最优解。

故考虑贪心。
假设前 i − 1 i-1 i1位排列已经达到最优的状态,则对于第 i i i位和当前的 k k k值,首先可以交换的数的范围是:
[ i + 1 , i + k ] [i+1,i+k] [i+1,i+k]
随后从该区间中找出值最大的数 M x Mx Mx

考虑两种情况,如果 M x &lt; a [ i ] Mx &lt; a[i] Mx<a[i]的话,则说明第 i i i位的数不用通过交换已经达到了最优的状态。
否则的话,删除原来位置的Mx,将 M x Mx Mx 插入到 a [ i ] a[i] a[i]之前,同时更新 k k k


但因为涉及数的插入和删除,对于顺序存储映像,该问题的总复杂度为不可承受的: O (

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值