news 2026/5/26 6:18:29

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/5/26 4:00:28

31、Unix 系统中描述符传递与线程管理技术解析

Unix 系统中描述符传递与线程管理技术解析 在 Unix 系统的开发中,我们常常会遇到进程间传递描述符以及线程管理的问题。下面将深入探讨描述符传递和 door-server-create 函数相关的技术要点。 1. 描述符传递基础 在进程间传递打开的描述符,常见的情况有两种:一是子进程…

作者头像 李华
网站建设 2026/5/26 4:00:42

35、Sun RPC 中的 XDR:外部数据表示详解

Sun RPC 中的 XDR:外部数据表示详解 1. Sun RPC 中 TCP 连接的问题检测 在 Sun RPC 里,使用 TCP 的客户端或服务器在检测对端问题方面有一定优势。当对端进程提前终止时,对端的 TCP 会自动关闭连接,这样就能检测到问题。然而,若对端是多线程的 RPC 服务器,对端线程的终…

作者头像 李华
网站建设 2026/5/25 18:20:44

37、进程间通信(IPC)性能测量与分析

进程间通信(IPC)性能测量与分析 1. 引言 在进程间通信(IPC)中,我们涉及到多种消息传递和同步机制。消息传递类型包括管道(pipes)、先进先出队列(FIFOs)、Posix 消息队列、System V 消息队列、门(doors)和 SunRPC;同步类型有互斥锁和条件变量、读写锁、fcntl 记录…

作者头像 李华
网站建设 2026/5/25 15:19:22

40、编程中的杂项代码及错误处理与练习解答

编程中的杂项代码及错误处理与练习解答 在编程实践中,我们会遇到各种各样的情况,包括代码配置、错误处理以及对各种编程问题的解决。下面将为大家详细介绍一些关键的编程知识和技巧。 1. 配置头文件 配置头文件在编程中起着重要作用,它可以定义各种宏和常量,为程序的编译…

作者头像 李华
网站建设 2026/5/26 5:14:56

使用Kotaemon构建IT运维知识自助服务平台

使用Kotaemon构建IT运维知识自助服务平台 在现代企业中&#xff0c;每当员工遇到“密码过期”、“VPN连不上”或“OA系统登录失败”这类问题时&#xff0c;第一反应往往是打开IM工具联系IT支持。然而&#xff0c;随着组织规模扩大&#xff0c;这类重复性请求迅速堆积成山——一…

作者头像 李华
网站建设 2026/5/26 2:34:15

12.16实习总结

用友兴合集团数字化平台项目实习优化了企查查数据应用模块中的诉讼风险数据同步批处理任务&#xff08;initInvestmentCheckData 方法&#xff09;。根据需求文档及数据库表结构&#xff0c;将原三表联合查询&#xff08;law_newadd、law_anxgf、base_businesspartner&#xff…

作者头像 李华