首页 > 其他分享 >P2524 Uim的情人节礼物•其之弐 题解

P2524 Uim的情人节礼物•其之弐 题解

时间:2024-02-19 16:48:15浏览次数:28  
标签:排列 20 int 题解 s1 Uim P2524 include

题目描述

前传:详见洛谷 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

相关文章

  • P3411 序列变换 题解
    自己做不出来,看现在题解区的题解讲的都不咋清楚。懂了之后来为后人铺路。而且我的马蜂比较好看题目传送门我能看懂这道题,主要是依靠了这篇题解的帮助。首先我们只关注数的相对关系,所以可以离散化。注意到值域\(10^6\),用数组离散化。这道题可以用贪心做。(有一些定义先往下看)......
  • P5914 MOS 题解
    一道练习贪心证明的好题。绝大多数题解只是点出了以下结论:要么最快的带最慢的;要么最慢的带次慢的。并没有给出证明。我就补上这个证明。为了证明这个贪心结论,我们先证明几个引理。引理一:每次将火把带回来的,一定是对岸最快的。引理一证明:如果回来的不是对岸最快的,让对岸最......
  • CF167B题解
    CF167B这里更容易进入且有翻译题意给定初始背包容量\(k\),要进行\(n\)场比赛,每场比赛有\(p_i\%\)的概率能够胜利,赢的一场比赛能获得一个奖励——当\(a_i=-1\)时获得一个体积为\(1\)的奖品,或者当\(a_i>0\)时给背包增加\(a_i\)容量,求所有比赛结束后至少赢得\(......
  • 理想的正方形——题解
    题目描述一看正方形,得,二维数组,单调队列。单调队列可以将一个区间最大值存储,所以只需要根据给定的正方形长度先横着推一遍,再竖着推一遍,将正方形中的最大值和最小值都储存在正方形右下角方格,最后遍历即可。先以行储存以k为长度的最大/小值;再以剩下k-m横向长度的最值向下扩展k个......
  • 跨域问题解决
    跨域举例A网站部署在localhost:63343请求loocalhost:8080/api/user/add,就会出现跨域问题。同源策略同源策略:协议,主机,端口,只有这三者全部相同时,才可以相互访问。现在接口地址为101.10.11.1X:8081,请判断以下哪些可以通过:访问地址描述结果https://127.0.0.1:808......
  • 数列的异或和(题解)
    题目样例样例输入5512345113135036113135样例输出0257二进制运算二进制运算的优先级小于四则运算,所以在与四则运算同时出现时,注意加括号按位与(&)在二进制下,相同位的数都为1时,这一位的结果为1,任意一个不是1或都是0,则为0(eg:0100110&0010111=000......
  • 场景问题解决方法
    1.tomcatspringboot通过域名访问时直接跳到127.0.0.1的问题这种情况极可能是因为 server.xml配置问题导致,可以参考这篇文章tomcat设置http代理详细教程-知乎(zhihu.com)2.如何访问内网中所有的服务和站点要访问一个内网中所有的服务和站点(如内网的所有网站和数据库等),......
  • think-cell Round 1 题解 (A~F)
    think-cellRound1.目录A.MaximiseTheScore排序后输出所有奇数位之和.B.PermutationPrinting\(1,n,2,n-1\cdots\).C.LexicographicallyLargest注意到对于一个\(a_i\)来说\([a_i+1,a_i+i]\)中的所有数都可以被选中,那么问题变给若干区间,每个区间选一个数要......
  • [ARC122E] Increasing LCMs 题解
    Description给定长度为\(N\)的正整数序列\(\{A_i\}\),满足\(A_i\)单调升。问是否能将\(\{A_i\}\)重排为序列\(\{x_i\}\),满足:令\(y_i=\operatorname{LCM}(x_1,\dots,x_i)\),\(\forall1\lei<N,y_i<y_{i+1}\)(即\(y_i\)单调升)。$1\\leq\N\\leq\......
  • ABC341E 题解
    看到01串的反转考虑维护异或差分序列\(s_i=a_i\oplusa_{i-1}\)。这样区间反转就变成了单点修改。然后考虑怎么查询:若一个区间\([l,r]\)是好区间,那么对于\(i\in[l+1,r]\)一定存在\(s_i=1\)。所以我们可以查询区间和来判断是否为好区间。使用线段树维护区间和即可,单......