news 2026/7/10 13:18:05

UVa 1697 Baggage

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 1697 Baggage

题目描述

某航空公司有两班几乎同时从ICPCity\texttt{ICPCity}ICPCity起飞的航班,分别飞往城市AAA和城市BBB。航空公司有nnn个柜台供乘客托运行李。每个柜台有一对相同的行李箱,一个用于城市AAA,一个用于城市BBB

在航班起飞前,每对行李箱被一台电动推车移动到分拣区。推车一次总是移动两个箱子(一个AAA市箱,一个BBB市箱)。所有箱子移动后,它们在分拣区排成一行:

B A B A B A … B AB\ A\ B\ A\ B\ A\ \ldots\ B\ ABABABABA

也就是说,有2n2n2n个行李箱排成一排,从BBB市箱开始,然后是AAA市箱,依此类推。现在的任务是将它们重新排序,使所有AAA市箱都排在所有BBB市箱之前。

重新排序是通过移动相邻的一对行李箱(不一定是BBB后接AAA)完成的,同样使用电动推车。为了保持平衡,推车必须总是装载两个箱子(或一个箱子加一个空位)。一对箱子必须总是被移动到一个至少有两个空位的空位上。在第一个箱子的左侧有一些空位,可以在重新排序过程中按需使用。

给定nnn,找到一个最短的移动序列,能将箱子重新排序,使所有AAA箱位于所有BBB箱的左侧。

输入格式

输入包含多个测试用例,每个用例独占一行,包含一个整数nnn(3≤n≤100)(3 \leq n \leq 100)(3n100)

输出格式

对每个测试用例,输出一个能正确重新排序箱子的最短移动序列。每次移动的形式为“ffftottt”,其中fffttt是整数,表示将位置ffff+1f+1f+1的箱子移动到位置tttt+1t+1t+1。如果有多个解,输出任意一个即可。

两个连续用例的输出之间用一个空行分隔。

解题思路

问题分析

这是一个典型的构造性递归问题。关键观察如下:

  1. 初始状态:位置1112n2n2n的排列为B A B A … B AB\ A\ B\ A\ \ldots\ B\ ABABABA
  2. 目标状态:所有AAA箱在左,所有BBB箱在右,即A A … A B B … BA\ A\ \ldots\ A\ B\ B\ \ldots\ BAAABBB
  3. 移动规则:每次移动相邻的两个位置(可能包含空位)到至少两格宽的空位。
  4. 最优性:至少需要nnn次移动,因为初始有nnnB AB\ ABA逆序对,每次移动最多修正一个逆序。

递归构造算法

通过分析问题结构,我们可以发现一个递归解法:

1. 基本思路

对于长度为2n2n2n的序列(位置lllrrr),我们可以通过以下步骤将其排序:

  1. 前两步固定移动:将最右边的一对移到左边空位,然后将左边的一对移到上一步腾出的空位。
  2. 递归处理:中间部分[l+4,r−4][l+4, r-4][l+4,r4]形成了一个规模更小(n−4n-4n4)的相同问题。
  3. 最后两步固定移动:完成剩余的对齐工作。
2. 算法正确性证明

定理:对于所有n≥3n \geq 3n3,上述递归算法能生成合法的nnn步移动序列,将B A B A …B\ A\ B\ A\ \ldotsBABA转换为A … A B … BA\ \ldots\ A\ B\ \ldots\ BAABB

证明(数学归纳法)

  1. 基础情况n=3,5,6,7n = 3, 5, 6, 7n=3,5,6,7时,算法使用硬编码的移动序列,可以通过直接验证证明正确性。

  2. 归纳假设:假设对于所有k<nk < nk<n,算法能正确生成移动序列。

  3. 归纳步骤:对于n≥8n \geq 8n8

    • 执行前两步固定移动后,左边[l,l+3][l, l+3][l,l+3]和右边[r−3,r][r-3, r][r3,r]已经部分有序。
    • 中间部分[l+4,r−4][l+4, r-4][l+4,r4]仍然保持原始的B A B A …B\ A\ B\ A\ \ldotsBABA模式,但长度减少了888(即规模减少444)。
    • 根据归纳假设,递归调用能正确排序中间部分。
    • 最后两步固定移动将左右部分对齐,完成整个序列的排序。
  4. 移动次数2+(n−4)+2=n2 + (n-4) + 2 = n2+(n4)+2=n次,恰好是最优的。

3. 边界情况处理

对于较小的nnn,我们直接使用最优移动序列:

  • n=3n = 3n=3333步移动
  • n=5n = 5n=5555步移动
  • n=6n = 6n=6666步移动
  • n=7n = 7n=7777步移动

这些序列是通过穷举或手工构造得到的最优解。

时间复杂度

算法的时间复杂度为O(n)O(n)O(n),因为每个测试用例恰好输出nnn行移动指令。递归深度为O(n)O(n)O(n),但实际递归调用次数有限。

空间复杂度

空间复杂度为O(1)O(1)O(1),除了递归调用栈外,只使用了常数空间。

代码实现

// Baggage// UVa ID: 1697// Verdict: Accepted// Submission Date: 2025-12-18// UVa Run Time: 0.000s//// 版权所有(C)2025,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;// 打印移动指令voidprint(intx,inty){cout<<x<<" to "<<y<<endl;}// 递归处理函数// l: 当前处理区间左边界// r: 当前处理区间右边界voiddfs(intl,intr){intlen=r-l+1;// 当前区间长度// 长度小于等于2不需要处理if(len<=2)return;// 处理基本情况if(len==10){// n = 5print(r-2,l-2);print(l+2,r-2);print(r-4,l+2);print(l-1,r-4);print(r-1,l-1);return;}if(len==12){// n = 6print(r-2,l-2);print(r-5,r-2);print(l+1,r-5);print(r-6,l+1);print(l-1,r-6);print(r-1,l-1);return;}if(len==14){// n = 7print(l+7,l-2);print(l+4,l+7);print(l+11,l+4);print(l+2,l+11);print(l+8,l+2);print(l-1,l+8);print(l+12,l-1);return;}// 通用递归情况:长度 >= 16 (n >= 8)// 前两步:右边一对移到左边空位,左边一对移到上一步的空位print(r-2,l-2);print(l+2,r-2);// 递归处理中间部分(规模减少4)dfs(l+4,r-4);// 最后两步:完成排序print(l-1,r-5);print(r-1,l-1);}intmain(){intn;boolfirst=true;while(cin>>n){// 测试用例之间用空行分隔if(!first)cout<<endl;first=false;// n = 3 的特殊情况if(n==3){print(2,-1);print(5,2);print(3,-3);}else{// 递归处理一般情况dfs(1,2*n);}}return0;}

总结

本题展示了如何通过递归构造解决排列重组问题。关键点在于:

  1. 发现递归结构:通过固定模式的前后处理,将大问题转化为小问题。
  2. 证明正确性:使用数学归纳法证明算法的正确性和最优性。
  3. 处理边界情况:小规模问题直接使用最优解。

这种"分而治之"的递归构造方法是解决许多构造性问题的有效技巧。通过精心设计的前后处理步骤,我们可以将复杂问题分解为更小的同类子问题,从而实现高效求解。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/11 8:42:26

36、深入了解Sun RPC:原理、格式与应用分析

深入了解Sun RPC:原理、格式与应用分析 1. 链表初始化 在处理数据结构时,链表的初始化是一项基础且重要的操作。这里为四个链表项分配了空间,但仅初始化了其中三个。初始化顺序依次为 nameval[2] 、 nameval[1] 和 nameval[0] ,链表头 out.list 被设置为 &n…

作者头像 李华
网站建设 2026/7/9 13:17:47

linux环境下python连接海康工业相机

参考&#xff1a;linux环境下python连接海康工业相机-CSDN博客 一、海康相机环境搭建 在linux环境下搭建&#xff0c;去海康机器人官网下载对应的安装包&#xff0c;下载链接: https://www.hikrobotics.com/cn/machinevision/service/download/?module0 解压MVS_STD_V3.0.1_…

作者头像 李华
网站建设 2026/7/10 8:49:30

【LH-AQ7A80】

LH-AQ7&A80 ■ AQ7■■■ ■■ A80■■■ ■ AQ7 安卓8.1系统&#xff0c; SDK27 AQ7、A80二次开发注意事项 1&#xff0c;开发前请先安装聚伟所提供电脑驱动&#xff0c;个别电脑因为电脑杀毒软件等影响不能识别&#xff0c;此时建议关掉所有杀毒软件或换台电脑使用开发…

作者头像 李华
网站建设 2026/7/11 6:21:34

Kotaemon支持Kyverno策略吗?Kubernetes原生管控

Kotaemon 与 Kyverno&#xff1a;构建可管控的 AI 应用基座 在企业加速推进 AI 落地的今天&#xff0c;一个常见的矛盾日益凸显&#xff1a;业务团队希望快速上线智能对话系统以提升服务效率&#xff0c;而运维和安全团队却对未经治理的 AI 工作负载充满担忧。这类应用往往资源…

作者头像 李华
网站建设 2026/7/10 19:00:14

10、互联网浏览与安全隐私全攻略

互联网浏览与安全隐私全攻略 1. 使用 RSS 订阅源 Internet Explorer 7 新增了订阅和下载新订阅源(通常称为 RSS 或 Atom 订阅源)的功能。这些订阅源对于内容频繁更新的网站(如新闻网站和博客)非常有用。当你在 Internet Explorer 中访问某个网站时,如果该网站有可用的订…

作者头像 李华
网站建设 2026/7/11 2:29:19

Kotaemon判决书摘要提取:关键信息速览

Kotaemon判决书摘要提取&#xff1a;关键信息速览 在法院每年处理数百万份判决书的今天&#xff0c;一份长达数十页的民事裁决文书&#xff0c;往往需要法官助理花上几个小时才能提炼出核心要点。面对如此庞大的非结构化文本数据&#xff0c;传统的人工阅读与归档方式早已不堪重…

作者头像 李华