会员专享
请先
登录,登录后可使用今日免费解锁;
开通会员后可解锁完整内容。
解题思路
本题的算法标签是「模拟 + 冒泡排序 / 逆序对」,可以拆成三个互不干扰的子问题:
- 分组:扫描一遍
s,按下标的奇偶性把字符分别放进两个序列。偶数下标进 A,奇数下标进 B,保持原有先后顺序;因为只按下标取值,用 s[0::2]、s[1::2] 也能直接得到 A、B。
- 排序并计数:对 A、B 分别做冒泡排序,排序的同时统计发生了多少次相邻交换。
- 拼接输出:把排序后的 A、B 依次拼接得到 t,再拼上空格和 k。
为什么 k 唯一。 在冒泡排序中,每交换一次相邻的逆序对 (x,y)(x>y),这两个元素的相对顺序就从「逆序」变成「正序」;而每次相邻交换恰好消除一个逆序对,排序完成时逆序对数为 0。所以无论是否提前结束、每轮是否缩小比较范围,累计交换次数都等于原序列的逆序对数,k=inv(A)+inv(B) 是一个定值。这也保证了不同写法的标程与选手代码得到的 k 一定相同。