题意:要用一个有序的序列生成给定序列,操作有两种,一是交换前两个元素,二是把第一个元素移动到最后去。

思路有两种:

1.映射,把给定序列映射成有序的序列,然后按照同样的替换规则把有序的序列映射掉,然后就可以排序啦。

具体解释可以看SRM 664的C题

2.逆向思考,把给定序列变成有序,操作相应变化一下,最后逆序输出操作。

至于排序的问题,把序列看成一个环,第二种操作相当改变了可交换元素的位置,然后就可以等效为冒泡排序啦。。。

第二种思路需要注意的一点是,是因为是环状的,和冒泡排序有所区别,最大的元素在头部的时候不能进行交换了,否则陷入死循环,最大的元素所在的位置相当与链状时候的最后面的有序区,是不需要比较的。

冒泡排序一次交换恰好消除一个逆序对,因此判断终止可以先求出逆序对总数,交换一次逆序数减一

#include<bits/stdc++.h>
using namespace std; int a[],t[],inv; void merge_sort(int l,int r)
{
if(l == r) return;
int mid = (l+r) >> ;
merge_sort(l,mid);
merge_sort(mid+,r);
int p = l, q = r, k = l;
while(p <= mid && q <= r){
if(a[p]>a[q]) {
inv += mid - p + ;
t[k++] = a[q++];
} else {
t[k++] = a[p++];
}
}
if(p>mid) for(int i = q; i <= r; i++) t[k++] = a[i];
else for(int i = p; i <= mid; i++) t[k++] = a[i];
for(k = l; k <= r; k++) a[k] = t[k];
} int main()
{
//freopen("in.txt","r",stdin);
int n, b[];
while(scanf("%d",&n),n){
for(int i = ; i < n; i++) {
int t; scanf("%d",&t);
b[t-] = i;
} memcpy(a,b,sizeof(int)*n);
inv = ;
merge_sort(,n-); for(int i = n-; i >= && inv ; i--){
for(int j = ; j < i; j++){
if( b[j] > b[j+]) {
swap(b[j],b[j+]);
putchar('');
inv--;
}
putchar('');
}
//continue move i -> 1
for(int j = i; j < n ;j++){
putchar('');
}
} putchar('\n');
}
return ;
}

UVA 11925 Generating Permutations 生成排列 (序列)的更多相关文章

  1. UVA - 11925 Generating Permutations(生成排列)(构造)

    题意:将序列1,2,3,……,n,用不超过2n^2次操作,通过下列操作变成给定序列.(1<=n<=300) 1.交换前两个元素 2.将第一个元素移到最后 分析:因为将序列变成升序更容易操作 ...

  2. UVA - 11925 Generating Permutations (思维,构造)

    给你一个长度为n(n<=300)的排列,有两种操作,第一种是交换前两个数,第二种是把第一个数放到最后,让你用不超过2n^2次的操作把一个初始为1-n升序的排列变为该排列. 一开始被紫薯蛋疼的翻译 ...

  3. UVA 11925 - Generating Permutations

    题意: 给出一个1到n的排列,给出操作顺序,使升序排列能变为所给排列. 分析: 正常冒泡排序的想法.如果前两个数,前面的大于后面的,则换(特例是n,1不能换).否则,就用2的逆操作,把最后的数放前面. ...

  4. UVa 11925 Generating Permutations (构造法)

    题意:给定一个序列,让你从一个升序列变成该序列,并且只有两种操作,操作1:交换前两个元素,操作2:把第一个元素移动到最后. 析:一开始的时候吧,不会,还是看的题解,首先是要逆序来做,这样可能好做一点, ...

  5. UVA 11925:Generating Permutations(冒泡排序 Grade D)

    VJ题目链接 题意:n个数(n<300),是一个1~n的某个排列.有两种操作:操作1把前两个数换位置,操作2把第一个数移动到最后.问给出一个排列,问通过怎样的操作,能把1,2,3,...,n变到 ...

  6. python 生成排列、组合以及选择

    from <python cookbook> 19.15 任务 需要对一个序列的排列(permutation).组合(combination)或选择(selection)进行迭代操作.即使 ...

  7. Matlab生成M序列的伪随机码

    伪随机编码中较常用的是m序列,它是线性反馈移位寄存器序列的一种,其特点是在相同寄存器级数的情况下输出序列周期最长.线性反馈移位寄存器的工作原理是,给定所有寄存器一个初始值,当移位脉冲到来时,将最后一级 ...

  8. UVA 10098 Generating Fast, Sorted Permutation

    // 给你字符串 按字典序输出所有排列// 要是每个字母都不同 可以直接dfs ^_^// 用前面说的生成排列算法 也可以直接 stl next_permutation #include <io ...

  9. dfs 生成排列和组合

    利用深度优先搜索的性质可以方便的生成n的排列和组合,但是生成组合时每个组合里面元素的个数必须事先确定,以前以为生成组合跟排列一样到n时就可以回溯,直到今天做了某题之后才发现那是错的,那样做生成不了所有 ...

随机推荐

  1. Centos7 使用 supervisor 管理进程

    一.安装 //直接使用pip安装(pip的安装 http://www.cnblogs.com/yxhblogs/p/8971251.html) pip install supervisor 二.配置 ...

  2. 安装Matlab出现Error 1935错误解决方法

    1.开始 - 运行(输入regedit.exe)- 确定或者回车,打开注册表编辑器: 2.在打开的注册表编辑器中找到:HKEY_LOCAL_MACHINE ,并展开:HKEY_LOCAL_MACHIN ...

  3. Linux 基础命令(一)

    Linux 基础: https://www.cnblogs.com/linhaifeng/articles/6045600.html Linux 比 Windows 更稳定做服务器,开发出来的软件需要 ...

  4. unity3d GUI字体设置

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class click001 ...

  5. Spark HA 配置中spark.deploy.zookeeper.url 的意思

    Spark HA的配置网上很多,最近我在看王林的Spark的视频,要付费的.那个人牛B吹得很大,本事应该是有的,但是有本事,不一定就是好老师.一开始吹中国第一,吹着吹着就变成世界第一.就算你真的是世界 ...

  6. 洛谷P3003 [USACO10DEC]苹果交货Apple Delivery

    P3003 [USACO10DEC]苹果交货Apple Delivery 题目描述 Bessie has two crisp red apples to deliver to two of her f ...

  7. 2014-8-5 NOIP(雾)模拟赛

    皇帝的烦恼(二分答案) Description 经过多年的杀戮,秦皇终于统一了中国.为了抵御外来的侵略,他准备在国土边境安置n名将军.不幸的是这n名将军羽翼渐丰,开始展露他们的狼子野心了.他们拒绝述职 ...

  8. ThinkSNS+ 是如何计算字符显示长度的

    什么是ThinkSNS+ ThinkSNS(简称TS),一款全平台综合性社交系统,目前最新版本为ThinkSNS+.ThinkSNS V4 ThinkSNS[简]. 今天我们来聊一下可能很多人都会头疼 ...

  9. PAT甲级——1114 Family Property (并查集)

    此文章同步发布在我的CSDN上https://blog.csdn.net/weixin_44385565/article/details/89930332 1114 Family Property ( ...

  10. mysql读取不同位置配置文件顺序

    读取顺序为: /etc/my.cnf basedir/my.cnf datadir/my.cnf --defaults-extra-file    #在读取全局配置文件之后,读取用户配置文件(~/.m ...