P2524 Uim的情人节礼物•其之弐 题解
题目描述
前传:详见洛谷 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的全排列数量是
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #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字符串,进行与综合排列进行比较。
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #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)); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库