POJ 1833 生成排列

题目链接:POJ 1833

/************************************
*              author        :  Grant Yuan
*              time            :   2014/10/19 16:38
*              source        :   POJ 1833
*              algorithm:    STL+排列的生成
*************************************/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int str[1030];
int ans[1030];
int n,k,t;
int main()
{
   scanf("%d",&t);
    while(t--){
        memset(str,0,sizeof(str));
        scanf("%d%d",&n,&k);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&str[i]);
        }
        for(int i=1;i<=k;i++)
        {
                bool b=next_permutation(str,str+n);
        }
      for(int j=0;j<n;j++)
        {
              if(j!=n-1)  printf("%d ",str[j]);
               else printf("%d\n",str[j]);
        }
    }
    return 0;
}
时间: 2024-10-25 05:21:09

POJ 1833 生成排列的相关文章

减一技术应用:生成排列与幂集(Java实现)

减一技术,与二分搜索一样,是一种通用算法设计技术.它是分治法的一种特殊形式,通过建立问题实例P(n) 与问题实例P(n-1)的递推求解关系式而实现:最经典的例子莫过于插入排序了.这里,给出减一技术在生成排列组合方面的应用. (一)  排列问题: 生成自然数 1,2,,,,,n 的所有排列. 算法描述: 使用减一技术,建立自然数12...n的排列与12...n-1的递推关系.假设 P(n-1) 是 自然数 12...n-1的所有排列 p1, p2,..., p(m)的集合,则P(n)通过如下方式得

HDU 4771 Stealing Harry Potter&#39;s Precious (生成排列+枚举 + BFS)

Stealing Harry Potter's Precious Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1982    Accepted Submission(s): 931 Problem Description Harry Potter has some precious. For example, his invisib

生成排列的递归方法

一  提议描述: 输入正整数n,按照字典序从小到大的顺序输出前n个数的所有排列. 二 思路分析: 对此问题用递归的思想解决:先输出所有以1开头的排列(递归调用),然后输出以2开头的排列(递归调用),接着以3开头的排列,„,最后才是以n开头的排列. 以1开头的排列的特点是:第一位是1,后面是按字典序的2-9的排列.所以在设计递归函数需要以下参数: (1)已经确定的“前缀”序列,以便输出: (2)需要进行全排列的元素集合,以便依次选做第一个元素. 这样,写出以下的伪代码: void print_pe

算法笔记03--归纳法之生成排列

生成排列 生成排列即对n个数的全排列,显然时间复杂度是n指数级的O(n^k) 假定可以生成n-1个数的所有排列,那么就可以扩展生成1,2,.....,n的排列. 例如1的生成排列即1 1,2的生成排列即1,2和2,1 1,2,3的生成排列在1,2的生成排列基础上可以这样得到: 1在第1位,2,3的生成排列 2在第1位,1,3的生成排列 3在第1位,2,3的生成排列 那么推广到1,2,...,n的生成排列即: 1在第1位,2,...,n的生成排列 2在第2位,1,3,...n的生成排列 ....

POJ 1833 排列(全排列 STL)

题目链接:http://poj.org/problem?id=1833 Description 题目描述: 大家知道,给出正整数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

poj 1833 排列

根据一个序列,求下一个序列.如果一串数字是降序排列,则一定是组合成的最大的数字,只要这串数字中有地方是升序的,则不是组合成的最大数字.比如:num[6] = 123654 从后向前,如果num[i] < num[i+1],则停止循环,在这里是3<6,则从num[i+1]后边的数字(5和4)里面找到一个数n,n满足条件n>3(num[i])&&n<6(num[i+1]),而且这个n是找到的满足条件里面的最小的(如果找不到这个n,则交换num[i]和num[i+1]),

POJ 1833 排列【STL/next_permutation】

题目描述: 大家知道,给出正整数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. Input 第一行是一个正整数m,表示

poj 1833

http://poj.org/problem?id=1833 next_permutation这个函数是用来全排列的,按字典的序进行排列,当排列无后继的最大值时,会执行字典升序排列,相当于排序: 当排列无后继的最大值时返回值为false,其他的为true: 也可以在其后加一个cmp函数 1 #include <stdio.h> 2 #include <iostream> 3 #include <algorithm> 4 5 using namespace std; 6

POJ 1833 排序

http://poj.org/problem?id=1833 题意: 给出一个排序,求出它之后的第k个排序. 思路: 排序原理: 1.如果全部为逆序时,说明已经全部排完了,此时回到1~n的排序. 2.从后往前找到第一对 ai<ai+1,然后从i+1~n寻找比ai大的最小的数并与之互换,之后再对i+1~n的数进行排序即可. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #includ