牛客-How to sort(置换群,排序相关)

本文围绕置换群问题展开,指出交换闭环上的数可使数组递增。赛中思路是以环中最小数为媒介交换,后发现还存在用数组中最小元素作媒介交换的情况,每次环增加的代价取两种情况中的较小值,最后提醒要对数组进行离散化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

置换群
题目链接
转自大佬
思路:
首先肯定交换的肯定是闭环上的数。比如说 4 3 1 2 5。第一个环是4–>2–>3–>1–>4,这几个位置上的数,交换一下位置可以得到递增的。环是以number–>pos[number]–>pos[pos[number]]…下去的。
比赛的时候爆WA了,说说赛中的想法。
赛中的时候想法就是肯定是用环中最小的数作为媒介去交换啊,记一个环的元素有k个,最小的数为Min,环的元素和为Sum。
肯定是拿Min去做n-1次交换啊,所以答案是(Sum-Min)+(k-1)*Min;即用最小的元素去跟其他的k-1个交换产生的价值。
没考虑到另外一种情况,举个例子:1 400 200 300,这个数组,环是400->300->200->400。那么我们拿200去换吗?肯定不是,显然用1作为媒介交换是最合适的。

所以有了第二种情况(赛后看了下AC的代码发现的思维误区),即拿数组中最小的元素作为媒介,去把当前环中的数交换成有序的。
记全部元素中最小的数是All_Min产生的代价是Min+Sum+(k-1)*All_Min。手推一下就OK的。
所以每次环增加的代价是这两种情况取小的那种。(说实话这题很质量啊,很考验思维。。哎还是我太菜了)

最后注意的是离散化一下数组,因为题目中给定的不是完全的1~n的数字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值