news 2026/4/28 13:44:38

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/4/17 16:40:24

包、关键字、代码块

包、关键字、代码块 一、包&#xff08;Package&#xff09; 概念本质&#xff1a;包即文件夹&#xff0c;用于对不同功能的Java类进行分类管理&#xff0c;便于代码的后续维护 包名规则命名格式&#xff1a;公司域名反写 包的作用&#xff08;全英文小写&#xff0c;遵循&quo…

作者头像 李华
网站建设 2026/4/21 7:00:01

41、深入解析 UNIX 网络编程相关技术

深入解析 UNIX 网络编程相关技术 1. 参考书目与资源 在学习 UNIX 网络编程时,有众多有价值的参考书目。如 Bach 于 1986 年所著的《The Design of the UNIX Operating System》,深入探讨了 UNIX 操作系统的设计;Birrell 和 Nelson 在 1984 年发表的 “Implementing Remote…

作者头像 李华
网站建设 2026/4/23 14:05:08

VisIC宣布获2600万美元融资,现代汽车领投

现代与起亚作为战略投资者加入&#xff0c;承诺将氮化镓技术整合至量产电动汽车平台氮化镓功率芯片公司 VisIC Technologies 宣布成功完成 B 轮融资的第二轮交割&#xff0c;筹集资金 2600 万美元。本轮融资由一家全球半导体领军企业领投&#xff0c;汽车制造商现代汽车与起亚&…

作者头像 李华
网站建设 2026/4/23 19:20:27

Kotaemon支持Prometheus监控吗?运维友好性测评

Kotaemon支持Prometheus监控吗&#xff1f;运维友好性测评 在企业级 AI 应用日益复杂的今天&#xff0c;一个智能对话系统是否“真正上线”&#xff0c;早已不再仅仅取决于它能否生成流畅的回答。更关键的问题是&#xff1a;当线上请求突增、响应延迟飙升、某些用户会话频繁中断…

作者头像 李华
网站建设 2026/4/17 18:27:29

通俗易懂的ISTA3E测试项目解说

ISTA 3E 是国际安全运输协会&#xff08;ISTA&#xff09;推出的高级模拟测试标准&#xff0c;专为整卡车&#xff08;FTL&#xff09;运输的成组同类包装产品设计 —— 适用于从生产地发往配送中心、整车厢装载同一目的地同类货物的运输场景。所谓 “成组货物”&#xff0c;指…

作者头像 李华