题目描述
前传:详见洛谷 P2525
Uim 成功地按照顺序将礼物送到了 N 个妹子的手里并维持她们的和谐。
现在 Uim 现在想知道,他最终选择的顺序是所有给 N 个妹子送礼顺序中,字典序第几小的。送礼顺序可以看作1,2,⋯,N 的一个排列。
输入格式
第一行一个整数N,表示有 N 个数。
第二行一个整数 X,表示给出的排列。
输出格式
一个整数,表示是第几小的字典序。
输入输出样例
输入 #1复制
3
231
输出 #1复制
4
说明/提示
1≤N≤9。
请注意输入的排列没有空格。
题意分析:
从样例来看,对于一个3的全排列有,{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}6个,其中按字典序第四个是{2,3,1},故答案为231,由此可知,本题是已知n和n的一个排列,问它是n的全排例中第x个的排列?由于1≤N≤9,这个范围故可以使用搜索算法求解。
N的全排列数量是
代码如下
#include<iostream> #include<string> #include<algorithm> using namespace std; int a[20],x,n,ans; bool b[20]; string s,s1; void dfs(int ni) { if (ni==0) { x++; s=""; for (int j=n;j>=1;j--) { s=s+char(a[j]+'0'); } if (s==s1) { ans=x; return ; } } for (int i=1;i<=n;i++) { if (b[i]==false) { a[ni]=i; b[i]=true; dfs(ni-1); b[i]=false; } } } int main() { cin>>n; cin>>s1; dfs(n); cout<<ans<<endl; return 0; }
皆可以使用stl中的next_permutation(),这里还用到了string字符串,进行与综合排列进行比较。
代码如下
#include<iostream> #include<string> #include<algorithm> using namespace std; int main() { int n; cin>>n; string s1; cin>>s1; int a[20]; for (int i=0;i<n;i++) a[i]=i+1; int ans=1; do { string s; s=""; for (int i=0;i<n;i++) { s=s+char(a[i]+'0'); } if (s==s1) { cout<<ans<<endl; break; } ans++; }while(next_permutation(a,a+n)); }
标签:排列,20,int,题解,s1,Uim,P2524,include From: https://www.cnblogs.com/smghj/p/18021428