题目描述
前传:详见洛谷P2525
Uim成功地按照顺序将礼物送到了N个妹子的手里并维持她们的和谐。
Uim现在想知道,他最终选择的顺序是所有给N个妹子送礼顺序中、字典序第几小的。
输入格式
第一行一个整数N,表示有N个数。
第二行一个整数X,表示给出的排列。
输出格式
一个整数,表示是第几小的字典序。
输入输出样例
输入 #1 复制
3
231
输出 #1 复制
4
说明/提示
1<=N<=9
输入的排列没有空格
思路:next_permutation设计下一个全排列,利用这个函数,设计一个新的数组从{1,2,……n}开始到{a1,a2,……an}。当新的数组和输入的数组相同,输出。
#include<bits/stdc++.h>
using namespace std;
bool cmp(int *a,int *b,int n)
{
for(int i = 0;i < n;i++) //一个一个比较两个数组是否相同
if(a[i] != b[i]) return false;
return true;
}
int main()
{
int n,a[10000],b[10000],s = 1;
scanf("%d",&n); //读入n
for(int i = 0;i < n;i++)
scanf("%1d",&a[i]); //读入数组a
for(int i = 0;i < n;i++)
b[i] = i+1; //b数组值为{1~n}
while(!cmp(a,b,n)) //如果两个数组不相同
{
next_permutation(b,b+n); //制造下一个全排列
s++; //计数
}
cout << s << endl; //输出答案
return 0;
}