UVA 11925 - Generating Permutations】的更多相关文章

题意: 给出一个1到n的排列,给出操作顺序,使升序排列能变为所给排列. 分析: 正常冒泡排序的想法.如果前两个数,前面的大于后面的,则换(特例是n,1不能换).否则,就用2的逆操作,把最后的数放前面.不过用了vector数组存放 代码: #include <iostream>#include <cstdio>#include <algorithm>#include <vector>using namespace std;int n;vector<int…
题意:给定一个序列,让你从一个升序列变成该序列,并且只有两种操作,操作1:交换前两个元素,操作2:把第一个元素移动到最后. 析:一开始的时候吧,不会,还是看的题解,首先是要逆序来做,这样可能好做一点,那么操作1不变,操作2变成把最后一个元素放到最前面. 就像是冒泡排序一样,如果第一个元素大于第二个,交换顺序,否则就把最后一个元素移动到最前面,但第三个样例就死循环了,我也算过,这样会一直重复某几个状态, 所以我们要维护第一个值,如果是最大的元素,那么就不让他们交换了. 代码如下: #include…
给你一个长度为n(n<=300)的排列,有两种操作,第一种是交换前两个数,第二种是把第一个数放到最后,让你用不超过2n^2次的操作把一个初始为1-n升序的排列变为该排列. 一开始被紫薯蛋疼的翻译给坑了,以为是把输入的排列变成升序,假如是这样的话,我们可以发现,每轮操作可以把任意一个数放到数组的最前面,而其他的数的位置不变,且每轮至多需要2*n次操作,于是写出了这样的代码: #include<bits/stdc++.h> using namespace std; typedef long…
VJ题目链接 题意:n个数(n<300),是一个1~n的某个排列.有两种操作:操作1把前两个数换位置,操作2把第一个数移动到最后.问给出一个排列,问通过怎样的操作,能把1,2,3,...,n变到这种排列?要求操作数<2n^2 思路:正常冒泡排序的想法.如果前两个数,前面的大于后面的,则换(特例是n,1不能换).否则,就用2的逆操作,把最后的数放前面. 代码: #include <cstdio> #include <cstring> #include <algori…
题意:要用一个有序的序列生成给定序列,操作有两种,一是交换前两个元素,二是把第一个元素移动到最后去. 思路有两种: 1.映射,把给定序列映射成有序的序列,然后按照同样的替换规则把有序的序列映射掉,然后就可以排序啦. 具体解释可以看SRM 664的C题 2.逆向思考,把给定序列变成有序,操作相应变化一下,最后逆序输出操作. 至于排序的问题,把序列看成一个环,第二种操作相当改变了可交换元素的位置,然后就可以等效为冒泡排序啦... 第二种思路需要注意的一点是,是因为是环状的,和冒泡排序有所区别,最大的…
题意:将序列1,2,3,……,n,用不超过2n^2次操作,通过下列操作变成给定序列.(1<=n<=300) 1.交换前两个元素 2.将第一个元素移到最后 分析:因为将序列变成升序更容易操作,所以倒着输出解,进行如下操作: 1.交换前两个元素 2.将最后一个元素移到第一个(当a[0] < a[1] || (a[0] == n && a[1] == 1)) #pragma comment(linker, "/STACK:102400000, 102400000&qu…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 让你把排列1..n变换成对应的输入序列. 每次可以交换前两个数字,或者把第一个数字放到末尾去. 可以逆向考虑. 即把无序的序列变换成有序的. 则第二种操作就变为"把末尾的数字放到最前面去" 则可以这样. 如果a[0]>a[1] 且a[0]不为n那么就swap(a[0],a[1]) 否则把最后面的那个数字放到开头. 之所以加一个a[0]不为n的判断.是为了模拟那个冒泡排序的过程. 即到了最后一位的话,肯定就不用判断…
// 给你字符串 按字典序输出所有排列// 要是每个字母都不同 可以直接dfs ^_^// 用前面说的生成排列算法 也可以直接 stl next_permutation #include <iostream> #include <string> #include<sstream> #include <cmath> #include <map> #include <stdio.h> #include <string.h> #…
/* * UVA_10098.cpp * * Created on: 2013年10月8日 * Author: Administrator */ #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; char s[11]; int l; bool get() { int i = l - 1; int j; while…
这道题要求按字典序生成字符串的全排列,不可重复(但字符可以重复,且区分大小写). 基本思路是先对输入的字符串按字典序排序,然后从第一位开始递归,从所有输入的字符中选出一个填充,然后再选第二位......具体实现看代码. 要注意的是最后的输出方式,不小心的话会莫名其妙的WA,详情见代码. 我的解题代码如下: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #in…