排列oj


835:排列
总时间限制:
5000ms

内存限制:
65536kB
描述
题目描述:
大家知道,给出正整数n,则1到n这n个数可以构成n!种排列,把这些排列按照从小到大的顺序(字典顺序)列出,如n=3时,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1六个排列。

任务描述:
给出某个排列,求出这个排列的下k个排列,如果遇到最后一个排列,则下1排列为第1个排列,即排列1 2 3…n。
比如:n = 3,k=2 给出排列2 3 1,则它的下1个排列为3 1 2,下2个排列为3 2 1,因此答案为3 2 1。
输入
第一行是一个正整数m,表示测试数据的个数,下面是m组测试数据,每组测试数据第一行是2个正整数n( 1 <= n < 1024 )和k(1<=k<=64),第二行有n个正整数,是1,2 … n的一个排列。
输出
对于每组输入数据,输出一行,n个数,中间用空格隔开,表示输入排列的下k个排列。
样例输入
3
3 1
2 3 1
3 1
3 2 1
10 2
1 2 3 4 5 6 7 8 9 10

样例输出
3 1 2
1 2 3
1 2 3 4 5 6 7 9 8 10

 思路, (1)给定排列中的n个数x1,x2,x3,x4....,xn。 (2)从xn开始向左查找,直到找到某个位置xj,满足xj-1<xj。 (3)在xj,xj+1,....,xn,中找到最小的比xj-1大的数,将这个数与xj-1交换。 (4)将位置j到n的所有数从小到大重新排序,得到最终的下一个序列。 (5)特别的,如果x1,x2,....,xn,已经是降序排列,则其下一个排序为xn,xn-1,....,x1。 模拟!!!!! 附上ac代码 #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cmath> #define REP(x,y,z) for(int x=y;x<=z;x++) #define ll long long using namespace std; int m,n,k; int a[1055]; void next_permutation(int size) { int flag=size-1; while(a[flag-1]>a[flag]&&flag!=0) { flag--; } if(flag==0) { REP(i,0,size-1) a[i]=i+1; return; } for(int i=size-1; i>=flag; i--) { if(a[i]>a[flag-1]) { swap(a[i],a[flag-1]); break; } } while(size-1>flag) { swap(a[size-1],a[flag]); flag++; size--; } } int main() { scanf("%d",&m); while(m) { scanf("%d %d",&n,&k); REP(i,0,n-1) scanf("%d",&a[i]); REP(i,0,k-1) next_permutation(n); REP(i,0,n-1) printf("%d ",a[i]); printf("\n"); m--; } return 0; }
时间: 2024-09-30 10:25:57

排列oj的相关文章

nyist oj 19 擅长排列的小明(dfs搜索+STL)

擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长.现在需要你写一个程序来验证擅长排列的小明到底对不对. 输入 第一行输入整数N(1<N<10)表示多少组测试数据, 每组测试数据第一行两个整数 n m (1<n<9,0<m<=n) 输出 在1-n中选

LeetCode OJ:Next Permutation(下一排列)

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). The replaceme

sdut oj 1163 C语言实验——排列 (当初不会递归生成排列,这个题目现在才补上 刘汝佳给出了写法 *【模板】 当然有生成全排列的函数存在 )

C语言实验——排列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 有4个互不相同的数字,请按序输出由其中三个不重复数字组成的排列. 输入 4个整数. 输出 所有排列,输出顺序见样例. 示例输入 1 2 3 4 示例输出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 1 2 4 1 4 2 2 1 4 2 4 1 4 1 2 4 2 1 1 3 4 1 4 3 3 1 4 3 4 1 4 1 3 4

南阳 oj 擅长排列的小明 题目19

 next  以及pre  函数的用法 http://blog.csdn.net/yueloveme/article/details/47164529 #include <stdio.h> #include <string.h> #include <algorithm> char a[10]={'1','2','3','4','5','6','7','8','9','\0'};//给定一个已排列的数组 using namespace std; int main()

九度oj 题目1466:排列与二进制

题目描述: 在组合数学中,我们学过排列数.从n个不同元素中取出m(m<=n)个元素的所有排列的个数,叫做从n中取m的排列数,记为p(n, m).具体计算方法为p(n, m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)! (规定0!=1).当n和m不是很小时,这个排列数是比较大的数值,比如  p(10,5)=30240.如果用二进制表示为p(10,5)=30240=( 111011000100000)b,也就是说,最后面有5个零.我们的问题就是,给定一个排列数,算出其二进制表示的

LeetCode OJ:Permutations(排列)

Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the following permutations:[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1]. 排列组合的问题,不用考虑是否发生重复的情况,代码如下: 1 class Solution { 2 public: 3 vector<vector<i

LeetCode OJ:Palindrome Partitioning(回文排列)

Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s. For example, given s = "aab",Return [ ["aa","b"], ["a","a","

众数问题(山东理工OJ)

题目描写叙述 给定含有n个元素的多重集合S,每一个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为众数. 比如,S={1,2,2,2,3.5}.多重集S的众数是2,其重数为3. 对于给定的由n 个自然数组成的多重集S.计算S的众数及其重数. 输入 输入数据的第1行是多重集S中元素个数n(n<1300000):接下来的n行中,每行有一个最多含有5位数字的自然数,. 输出 输出数据的第1行给出众数,第2行是重数. 演示样例输入 6 1 2 2 2 3 5 演示样例输出 2 3 #i

【剑指offer】字符串的排列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26390551 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个测试案例包括1行. 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 输出: 对应每组数据,按字典序输出所有排列. 样例输入: abc BCA 样例输出: