Mapping the Swaps

Sorting an array can be done by swapping certain pairs of adjacent entries in the array. This is the fundamental technique used in the well-known bubble sort. If we list the identities of the pairs to be swapped, in the sequence they are to be swapped, we obtain what might be called a swap map. For example, suppose we wish to sort the array A whose elements are 3, 2, and 1 in that order. If the subscripts for this array are 1, 2, and 3, sorting the array can be accomplished by swapping A2 and A3, then swapping A1 and A2, and finally swapping A2 and A3. If a pair is identified in a swap map by indicating the subscript of the first element of the pair to be swapped, then this sorting process would be characterized with the swap map 2 1 2.

It is instructive to note that there may be many ways in which swapping of adjacent array entries can be used to sort an array. The previous array, containing 3 2 1, could also be sorted by swapping A1 and A2, then swapping A2 and A3, and finally swapping A1 and A2 again. The swap map that describes this sorting sequence is 1 2 1.

For a given array, how many different swap maps exist? A little thought will show that there are an infinite number of swap maps, since sequential swapping of an arbitrary pair of elements will not change the order of the elements. Thus the swap map 1 1 1 2 1 will also leave our array elements in ascending order. But how many swap maps of minimum size will place a given array in order? That is the question you are to answer in this problem.

Input

The input data will contain an arbitrary number of test cases, followed by a single 0. Each test case will have a integer n that gives the size of an array, and will be followed by the n integer values in the array.

Output

For each test case, print a message similar to those shown in the sample output below. In no test case willn be larger than 5.

Sample Input

2 9 7
2 12 50
3 3 2 1
3 9 1 5
0

Sample Output

There are 1 swap maps for input data set 1.
There are 0 swap maps for input data set 2.
There are 2 swap maps for input data set 3.
There are 1 swap maps for input data set 4.

 

 

题意: 求通过交换相邻元素排序,求最少交换次数的方法有几种。

最少交换次数就是逆序对数,枚举交换方案即可。

另外,用冒泡排序的方法一定是交换次数最少的方案。

 

解法一: 枚举逆序对数减少的方案,到达有序序列的时候,就一定是最少交换次数的方案。 time: 0.015

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int maxn = 10;
int n;
int a[maxn];
int ans;
bool isorder()
{
for(int i=0;i<n-1;i++) if(a[i]>a[i+1])
return false;
return true;
} void dfs(int d)
{
if(isorder())
{
ans++; return;
} for(int i=0;i<n-1;i++) if(a[i]>a[i+1])
{
swap(a[i], a[i+1]);
dfs(d+1);
swap(a[i], a[i+1]);
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("./uva331.in", "r", stdin);
#endif
int kase=0;
while(scanf("%d", &n)==1 && n)
{
for(int i=0;i<n;i++) scanf("%d", a+i);
ans=0;
if(!isorder())
dfs(0);
printf("There are %d swap maps for input data set %d.\n", ans, ++kase);
} return 0;
}

解法二: 先求出逆序对数d,然后暴力枚举排序方案(控制深度为d),如果到达深度d时,序列变成有序序列,就找到一个最少交换次数的方案。 time: 0.059

 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=10;
int n;
int inv, a[maxn], ans;
void dfs(int d)
{
if(d==inv) {
for(int i=0;i<n-1;i++) if(a[i]>a[i+1]) return;
ans++;
} else for(int i=0;i<n-1;i++) {
swap(a[i], a[i+1]);
dfs(d+1);
swap(a[i], a[i+1]);
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("./uva331.in", "r", stdin);
#endif
int kase = 0;
while(scanf("%d", &n) == 1 && n) {
for(int i=0;i<n;i++) scanf("%d", &a[i]);
inv=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if(a[i]>a[j]) inv++;
ans=0;
if(inv > 0) dfs(0);
printf("There are %d swap maps for input data set %d.\n", ans, ++kase);
} return 0;
}

uva331 - Mapping the Swaps的更多相关文章

  1. UVA Mapping the Swaps

    题目例如以下: Mapping the Swaps  Sorting an array can be done by swapping certain pairs of adjacent entrie ...

  2. uva 331 Mapping the Swaps 求交换排序的map 纯DFS

    给出一个序列,每次交换两个数,求有几种交换方法能使序列变成升序. n不大于5,用dfs做. 代码: #include <cstdio> #include <cstring> # ...

  3. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

  4. AutoMapper:Unmapped members were found. Review the types and members below. Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type

    异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 应用场景:ViewModel==>Mode映射的时候出错 AutoMappe ...

  5. 使用MyBatis Generator自动创建代码(dao,mapping,poji)

    连接的数据库为SQL server2008,所以需要的文件为sqljdbc4.jar 使用的lib库有: 在lib库目录下新建一个src文件夹用来存放生成的文件,然后新建generatorConfig ...

  6. Nhibernate mapping 文件编写

    生成工具软件 现在生成工具软件有很多了,例如商业软件:NMG.CodeSmith.Visual NHibernate,开源软件:MyGeneration.NHibernate Modeller.AjG ...

  7. mybatis generator.xml 配置 自动生成model,dao,mapping

    generator.xml文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE gener ...

  8. Spring MVC --->>>No mapping found for HTTP request with URI

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> < ...

  9. elasticsearch 之mapping

    搭好elk 后,有时候会发现kibana 统计数据时,数据类型不对,这个时候就和elasticsearch的mapping有关,虽然我们可以用logstash修改传入es里的数据类型,比如 float ...

随机推荐

  1. MySQL基础之第17章 MySQL日志

    17.1.日志简介 二进制日志错误日志通用查询日志慢查询日志 17.2.二进制日志 二进制日志也叫作变更日志(update log),主要用于记录数据库的变化情况.通过二进制日志可以查询MySQL数据 ...

  2. android LinearLayout 实现两端对齐

    <?xml version="1.0″ encoding="utf-8″?> <LinearLayout xmlns:android="http://s ...

  3. Codeforces Round #215 (Div. 2) D题(离散化+hash)

    D. Sereja ans Anagrams time limit per test 1 second memory limit per test 256 megabytes input standa ...

  4. JAVA CAS原理、unsafe、AQS

    concurrent包的实现 由于java的CAS同时具有 volatile 读和volatile写的内存语义,因此Java线程之间的通信现在有了下面四种方式: A线程写volatile变量,随后B线 ...

  5. Windows 环境搭建cocos2dx 3.x Eclipse的环境

    安装JDK,该步骤网上太多,不再赘述; 安装NDK,同样,直接去Google找到最新的NDK,下载解压到某个盘符根目录即可; 简便起见,使用ADT Bundle,而不要去使用Eclipse的原生包,可 ...

  6. HDU3333 Turing Tree 离线树状数组

    题意:统计一段区间内不同的数的和 分析:排序查询区间,离线树状数组 #include <cstdio> #include <cmath> #include <cstrin ...

  7. 全方位掌握 NSIS 的操作

    NSIS 确实是一个不错的安装程序制作软件.新版本2.0a7真正实现了中文支持和支持 WinXP 的安装对话框.不过要用它实现漂亮的安装界面和完美的安装功能就必须好好的写脚本.而 NSIS 的脚本指令 ...

  8. python中隐式的内存共享

    在python中,基本上使用的是引用,那么就会造成一个隐式的内存共享,特别是在容器对象中,例如list,dictionary 对于不可变对象,是不会造成隐式的内存共享情况,如下所示: >> ...

  9. Go语言相关图书推荐

    Go语言编程 作      者 许式伟 等 著 出 版 社 人民邮电出版社 出版时间 2012-08-01 版      次 1 页      数 245 印刷时间 2012-08-01 开      ...

  10. ref 参数

    当使用ref 作为参数赋值时,ref 得需要初始化,就是在从新定义一下 参数的值,下面有列子: 在控制台中运行如下: //定义一个方法,两个参数 i和a . public static void ge ...