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));
}

  

posted @ 2024-02-19 16:33  心悟&&星际  阅读(40)  评论(0)    收藏  举报