1 条题解
-
0
问题重述
有 只河狸排成一排, 只唱 A 声部, 只唱 B 声部。要将它们分成 组(歌曲),每组需满足:
- 至少一只河狸
- A 声部数量 = B 声部数量
- 组内所有 A 声部河狸都在所有 B 声部河狸的右边
只能通过交换相邻河狸来调整位置,求最少交换次数。
关键观察
1. 条件分析
第三个条件「所有A都在所有B的右边」意味着:对于任意一组,其成员的排列形如:
[一些B] [一些A]且 A 的数量 = B 的数量。
2. 问题转化
设最终分组为 段,每段包含 只河狸( 对 A-B)。
由于 A 的总数 = B 的总数 = ,我们有:
3. 位置约束
考虑最终排列中 A 和 B 的分布:
- 第 组需要 个 A 和 个 B
- 所有组的 A 必须按组顺序排在对应组的 B 的右边
这实际上要求最终的排列形如:
[B...B A...A] [B...B A...A] ... [B...B A...A]其中第 个块有 个 B 和 个 A。
核心解法
1. 最优结构
关键结论:存在最优解,使得最终排列是:
- 前 个位置是第1组的 B
- 接着 个位置是第1组的 A
- 接着 个位置是第2组的 B
- 接着 个位置是第2组的 A
- ...
- 最后 个位置是第K组的 A
2. 代价计算
设原序列中:
- = 第 个 A 的原始位置(从左到右编号 1..2N)
- = 第 个 B 的原始位置
在最终排列中:
- 第 组的 B 占据位置: 到
- 第 组的 A 占据位置: 到
交换次数 = 将每个河狸移动到目标位置的距离和。
3. 问题简化为划分问题
我们需要将 个 A 和 个 B 分成 组,每组 对,最小化总移动距离。
设:
- = 前 个 A 的原始位置和
- = 前 个 B 的原始位置和
对于给定的划分 ,其中 ,代价为:
$$\sum_{j=1}^K \left[ \sum_{k=p_{j-1}+1}^{p_j} (2p_{j-1} + k - posB[k]) + \sum_{k=p_{j-1}+1}^{p_j} (2p_{j-1} + t_j + k - posA[k]) \right] $$化简后是关于 的二次函数,可以使用动态规划优化。
算法框架
1. 预处理
- 提取所有 A 和 B 的位置
- 计算前缀和 ,
2. 动态规划
设 = 将前 对 A-B 分成 组的最小代价。
转移:
$$dp[i][j] = \min_{0 \le k < i} \{ dp[k][j-1] + cost(k+1, i) \} $$其中 是将第 到第 对 A-B 作为一组的代价。
3. 代价函数
经过推导, 可以写成:
$$cost(l, r) = C + \alpha \cdot l + \beta \cdot r + \gamma \cdot l^2 + \delta \cdot r^2 + \epsilon \cdot lr $$的具体形式,满足决策单调性。
4. 优化
由于代价函数满足四边形不等式,可以使用分治优化将复杂度从 降到 。
对于 需要进一步观察性质:
关键性质:最优解中 的差异不超过 1,即 。
最终算法
-
确定分组大小:,
- 有 组大小为 , 组大小为 ,满足 ,
-
计算最小代价:
- 枚举 和 的排列方式
- 对于每种排列,直接计算总移动距离
-
输出最小代价
复杂度分析
- 确定分组:
- 计算代价:
- 总复杂度:,适合
总结
这道题的核心在于:
- 理解分组条件:A 必须在 B 的右边,且数量相等
- 发现最优结构:排列形如 [B...B A...A] 的连续块
- 代价计算:将问题转化为划分问题
- 优化决策:利用分组大小的均匀性降低复杂度
通过分析问题的组合结构,我们将看似复杂的交换问题转化为简洁的数学优化问题。
- 1
信息
- ID
- 4506
- 时间
- 6000ms
- 内存
- 1024MiB
- 难度
- 9
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者