题目链接今天学了 全排列函数 之后,再回过头来看这一题,发现这时对于这样的题 就是一个字 秒 。主要函数有两个 next_permutation 和 prev_permutation这两个一个是向后找 一个是向前找,next的是往后,prev的是向前找。有的人可能不太明白我这里只的向前和向后的意思。 向前 就是 往 字典序小 的 方向 找 ,反之 就是向前。
举个例子把 :假设数组a[n],i<=m,next_permutation(a+i,a+m)就表示对a[i]到a[m]进行操作,每操作一次字典序就增大“一个单位”,
例:a[0] = 1, a[1] = 2, a[2] = 3 操作一次之后,就变为 a[0] = 1, a[1] = 3, a[2] = 2;
prev_permutation 用法与之相同。
有了这些知识,现在再来看这一题,那就简单了。
(hdu1716排列2和这一题十分类似,以前我是直接暴力过得,现在有了这个可以轻松许多了)
代码如下:
#include <iostream> #include <algorithm> #define MAXN 1000 + 10 using namespace std; int a[MAXN]; int main(){ int n,m,i; while(cin>>n>>m){ for(i = 1;i<=n;i++) a[i] = i; for(i = 1;i<m;i++) next_permutation(a+1,a+n+1); for(i = 1; i <= n; i++ ){ if(i > 1) cout<<" "; cout<<a[i]; } cout<<endl; } return 0; }
时间: 2024-12-20 22:13:25