给你两个长度为 N 的排列 P 和 Q,且这两个排列都是由 1,2,3,…,N 组成。
易知,对于长度为 N 的排列,存在 N! 种排列。现在,请你求出排列 P 和 Q 在长度为 N 的排列中的序列数分别是 a 和 b,并输出 ∣a−b∣。
输入格式:
第一行为一个整数 N,2≤N≤8。
第二行为排列P,第三行为排列Q。
输出格式:
输出一个整数,即 ∣a−b∣。
输入样例:
在这里给出一组输入。例如:
3
1 3 2
3 1 2
输出样例:
在这里给出相应的输出。例如:
3
样例解释:
对于长度为 3 的排列有6种。
分别为(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)。
在这之中(1,3,2)属于第二个排列,(3,1,2)属于第五个排列,故输出∣2−5∣=3。
思路:根据输入的数据,创建一个数组,用来存储第一个排列。接下来创两个数组,用于存储输入的两个排列。调用用algorithm中得prev_permutation(a,a+n)对输入的数组进行排列,temp计数,直到输入的数组和第一个排列相等,此时的temp就是a的次序。同理得b,再调用cmath中的abs()得出答案。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
int n;
cin>>n;
int *key=new int[n];
int *a=new int[n];
int *b=new int[n];
for(int i=0;i<n;i++)
{
key[i]=i+1;
cin>>a[i];
}
for(int i=0;i<n;i++)
{
cin>>b[i];
}
int tempA=1;
while(true)
{
int i;
for(i=0;i<n;i++)
{
if(key[i]!=a[i])
{
break;
}
}
if(i==n){
break;
}
tempA++;
prev_permutation(a,a+n);
}
int tempB=1;
while(true)
{
int i;
for(i=0;i<n;i++)
{
if(key[i]!=b[i])
{
break;
}
}
if(i==n){
break;
}
tempB++;
prev_permutation(b,b+n);
}
cout<<abs(tempA-tempB);
}
提交结果