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的全排列数量是
代码如下
#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));
}
浙公网安备 33010602011771号