POJ 1833 排列

来源:互联网 发布:node sass失败 编辑:程序博客网 时间:2024/05/21 05:55

题意:

给你一个排列,要你求这个排列下的第K个排列,如果遇到最后一个排列,则下1个排列为第一个排列

思路:

c++的STL中提供了一个库函数next_permutation求下一个排列,当求出的排列为最后一个排列时,返回值为0,注意提交的时候用C++,不然会TLE

代码如下

#include<stdio.h>#include<math.h>#include<string.h>#include<algorithm>#include<limits.h>using namespace std;int main(){int m;scanf("%d",&m);while(m--){int n,sum;int a[1111];scanf("%d %d",&n,&sum);for(int i=1; i<= n; i++)scanf("%d",&a[i]);int flag=0;while(flag< sum){while(next_permutation(a+1,a+n+1)){flag++;if(flag==sum){printf("%d",a[1]);for(int i=2; i<= n; i++)printf(" %d",a[i]);printf("\n");break;} }for(int i=1; i<= n; i++)a[i]= i;flag++;if(flag==sum){printf("%d",a[1]);for(int i=2; i<= n; i++)printf(" %d",a[i]);printf("\n");break;}}/*我之前不知道next_permutation执行到最后一个排列时候,再往下执行时会自动循环到第一个排列 所有我在 ext_permutation执行到最后一个排列,做了特判,让排列跳到第一个排列去 后面月神告诉我了,我才知道这里其实不必要写这么长只需要int flag=0;while(flag< sum){flag++;next_permutation(a+1,a+n+1);}printf("%d",a[1]);for(int i=2; i<= n; i++)printf(" %d",a[i]);printf("\n");*/ }return 0;}


next_permutation的用法:

作用是求当前排列的下一个排列

 这个函数的用法就和sort一样,注意执行到最后一个排列时,函数返回值为0