uva331 - 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的更多相关文章
- UVA Mapping the Swaps
题目例如以下: Mapping the Swaps Sorting an array can be done by swapping certain pairs of adjacent entrie ...
- uva 331 Mapping the Swaps 求交换排序的map 纯DFS
给出一个序列,每次交换两个数,求有几种交换方法能使序列变成升序. n不大于5,用dfs做. 代码: #include <cstdio> #include <cstring> # ...
- UVA题目分类
题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...
- 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 ...
- 使用MyBatis Generator自动创建代码(dao,mapping,poji)
连接的数据库为SQL server2008,所以需要的文件为sqljdbc4.jar 使用的lib库有: 在lib库目录下新建一个src文件夹用来存放生成的文件,然后新建generatorConfig ...
- Nhibernate mapping 文件编写
生成工具软件 现在生成工具软件有很多了,例如商业软件:NMG.CodeSmith.Visual NHibernate,开源软件:MyGeneration.NHibernate Modeller.AjG ...
- mybatis generator.xml 配置 自动生成model,dao,mapping
generator.xml文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE gener ...
- Spring MVC --->>>No mapping found for HTTP request with URI
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> < ...
- elasticsearch 之mapping
搭好elk 后,有时候会发现kibana 统计数据时,数据类型不对,这个时候就和elasticsearch的mapping有关,虽然我们可以用logstash修改传入es里的数据类型,比如 float ...
随机推荐
- 支持 MBTiles 规范的预缓存
SuperMap iServer 支持生成符合MBTiles规范的预缓存(MBTiles是由MapBox制定的一种将瓦片地图数据存储到SQLite数据库中并可快速使用,管理和分享的规范. 该规范由Ma ...
- 关于Servlet的PrintWriter 中文乱码问题
ps:servlet的PrintWriter和ServletOutputStream是不能同时使用的,同时使用会抛异常; PrintWriter是字符流.ServletOutputStream是字节流 ...
- Oracle 数据库中日期时间的插入操作
Oracle 中如何插入日期时间类型的数据,首先为了演示, 新建数据表如下 create table t( mydate date); 插入日期时间 SQL> insert into t val ...
- 精品手游《里奥的财富》高清版逆向移植家用机与PC平台(转)
冒险动作游戏<里奥的财富>于去年10月登陆移动平台,曾荣获App Store“年度优秀游戏”.开发商宣布将推出其HD版本,近期会陆续登陆PS4.PC.MAC.Xbox One平台. 由瑞典 ...
- 【LeetCode】7 & 8 - Reverse Integer & String to Integer (atoi)
7 - Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 Notic ...
- Emmet使用手册
语法: 1.后代:> 缩写:nav>ul>li < nav> < ul> < li></ li > ...
- WinForms 使用Graphics绘制字体阴影
C#以两种方法实现文字阴影效果,同时还实现了简单的动画效果: 一种是对文本使用去锯齿的边缘处理,在两个不同的位置绘制文本,形成阴影: 另一个是以阴影为线条,构造影线画刷,先画背景再画前景,使用grap ...
- 阿里云存储OSS之九大使用技巧
http://www.biphp.com/cloud-computing/%E9%98%BF%E9%87%8C%E4%BA%91%E5%AD%98%E5%82%A8oss%E4%B9%8B%E4%B9 ...
- html5页面中拨打电话的方式
<a href="tel:18688888888">拨号</a> <a href="sms:18688888888">发短信 ...
- Azure linux centos 默认登陆账号是什么?
什么?刚创建的linux虚拟机账号忘记了? 不要急,往下看!! Azure为我们考虑好了,默认创建centos 系统时,默认账号是azureuser,这个账号是非root权限的. 很多人在创建的时候容 ...