#P3460. Booksort
Booksort
中文题面:
描述:
莱顿大学图书馆拥有数百万册藏书。当学生想要借阅某本特定书籍时,通常会在线提交借书申请。如果书籍可外借,次日学生即可到借书处领取。这是图书馆现代借书方式。
图书馆内有一个部门,书架林立,仍沿用传统借书方式。学生可直接在书架间走动,挑选心仪的书籍,登记后带回家,最长可借阅三周。
然而,常出现以下情况:学生从书架上取下一本书,仔细查看后决定不阅读,便将其放回。
遗憾的是,并非所有学生都会谨慎处理最后一步。尽管每本书均有唯一识别码(用于按序排列书架),但部分学生会将浏览过的书籍放错位置。他们确实会将书放回正确的书架,但未归位到书架上的正确位置。其他学生通过唯一识别码(可在在线目录中查询)查找想借的书籍。
对他们而言,书籍是否按识别码排序至关重要。对图书管理员来说,书籍有序排列同样重要,这能更轻松地核查是否存在失窃情况(即书籍未被借出却缺失)。
因此,图书管理员每周会巡查该部门,并整理每层书架。整理单层书架可行,但仍需耗费相当精力。管理员考虑过多种算法后,认为通过转置排序是最简单的方法:
只要书籍未排序,取出相邻的若干本书(一个书块);
将“空缺”左侧或右侧的另一书块移入空缺;
将第一步取出的书块放回第二步操作后的新空缺。
上述步骤序列称为一次转置。
下图可帮助理解算法步骤(表示第一个书块,表示第二个书块):
Original situation: | |
After step 1: | |
After step 2: | |
After step 3: |
显然,管理员希望尽可能减少工作量,即对每层书架,用最少的转置次数完成排序。
尤其需要判断:能否在最多次转置内完成排序?请回答这一问题。
输入:
输入文件第一行为测试用例数量。每个测试用例格式如下:
一行整数 ,表示某层书架的书籍数量;
一行个整数(至的某种排列),表示当前书架上书籍的唯一识别码顺序,空格分隔。
输出:
对每个测试用例,输出一行:
若将书籍按识别码升序排列所需的最小转置次数,输出;
若需至少次转置,输出“5 or more”。
输入数据1
3
6
1 3 4 6 2 5
5
5 4 3 2 1
10
6 8 5 3 4 7 2 9 1 10
输出数据1
2
3
5 or more
来源
2006年波罗的海算法与编程竞赛资格赛