题解 P2524 【Uim的情人节礼物·其之弐】

我发现楼下们是不是想得太多了……

有必要用什么康托展开吗……

既然我学的是c++,那当然要知道STL大法好

重点来了!

思路:

用STL全排列函数,不断求上一个字典序,同时累加;

如果求不了了,说明这就是第一个字典序,就可以输出了。

AC代码(cpp):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
prev\_permutation()函数用法:()内为内存中的一段连续空间的起点和终点,每次调用都将指定内存中的值修改为上一个字典序,如果当前排列已是第一个,返回“false”。
#include <bits/stdc++.h>//万能头文件
using namespace std;//流读入要的一句话
int n,ans;//n是个数,ans是答案
char a[10005];//虽说n只有0~9,但由于我是直接从2525抄过来的程序,就懒得改了
//由于输入没有“ ”,且n<=9,所以a[i]一定是一位数,用char才行
int main(void){
ios::sync\_with\_stdio(false);//毫无意(luan)义(yong)的流优化
cin>>n;
for (int i=0;i<n;i++)cin>>a[i];
while (prev\_permutation(a,a+n))ans++;//如果函数返回值为0,就会退出,不然不断求上一个字典序,ans同时累加
cout<<ans+1;//该顺序也算一个,所以ans要加1(ans是之前的字典序数量)
}
PS:说我是在抄2525的代码?别说的那么难听行不?我只是代码的搬运工。
想抄代码?恩哼哼^-^!