题意:对于n个数的数列,进行排列,求第m个大于此数列的数列。
思路:查找后2个是否逆序,若是,将后3个递归。如此运算,找后面大于此数中最小数交换,然后将后面数列顺序排列。
相对简单。
见代码:
#include<iostream> #include<cmath> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; int n,m,a[100001],flag; void sort1(int); bool cmp(int,int); bool ni(int); int main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; a[0]=0x3f3f3f3f; for(int i=1;i<=m;i++) { flag=0; sort1(2); for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl; } return 0; } void sort1(int x) { if(ni(x)) sort1(x+1); else { if(x==2) swap(a[n-1],a[n]); else { for(int i=n-x+2;i<=n;i++) { if(a[i]<a[flag]&&a[i]>a[n-x+1]) { flag=i; } } swap(a[n-x+1],a[flag]); sort(a+n-x+2,a+n+1,cmp); } } } bool ni(int x) { for(int i=n-x+1;i<n;i++) { if(a[i]<a[i+1]) return false; } return true; } bool cmp(int x,int y) { return x<y; }