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

  

posted @   心悟&&星际  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示