题目描述
全排列和字典序应该不用再介绍了。。。
总而言之,你有两个长为N的排列,他们在全排列中都有一席之地,你需要输出他们在按字典序排列的全排列中的排名之差。
123和321谁排第一呢?出题人不想管了,所以决定让你abs一下。
输入
第一行一个正整数N
第二行一个长为N的排列表示排列A
第三行一个长为N的排列表示排列B
数据保证2<=n<=8
输出
输出一个非负整数表示他们排名的差值
样例输入
样例输入1:
3
1 3 2
3 1 2
样例输入2:
8
7 3 5 4 2 1 6 8
3 8 2 5 4 6 7 1
样例输入3:
3
1 2 3
1 2 3
样例输出
样例输出1:
3
样例输出2:
17517
样例输出3:
0
题解
方法很多,数据范围很小,我是直接2遍dfs 直接判断
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=10;
const int MOD=1e9+7;
int n;int a[N],s[N],b[N];
bool st1[N],st2[N];
int ans,re1,re2,hh;
void df1(int u)
{
if(u==n+1)
{
ans++;
bool is=true;
for(int i=1;i<=n;i++)
{
if(a[i]!=s[i])
{
is=false;
break;
}
}
if(is)re1=ans;
}
for(int i=1;i<=n;i++)
{
if(!st1[i])
{
s[u]=i;
st1[i]=true;
df1(u+1);
st1[i]=false;
}
}
}
void df2(int u)
{
if(u==n+1)
{
ans++;
bool is=true;
for(int i=1;i<=n;i++)
{
if(b[i]!=s[i])
{
is=false;
break;
}
}
if(is)re2=ans;
}
for(int i=1;i<=n;i++)
{
if(!st2[i])
{
s[u]=i;
st2[i]=true;
df2(u+1);
st2[i]=false;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
df1(1);
ans=0;
df2(1);
cout<<abs(re1-re2);
}