1 条题解
-
0
【例57.1】 字典序第几小
解题思路
使用康托展开。第i位右侧比它小的数字有c个,它们放在此位会各产生(n-i-1)!个字典序更小的排列。累加所有位置贡献,最后加1作为1起始排名。
正确性说明
按顺序完成所述运算后,每个输入元素都被处理在相应位置或统计项中。保存的中间状态与已处理数据对应,最终输出与题目定义一致。
易错点
排名从1开始;输入排列是一个连续数字串。
复杂度
时间O(n²),空间O(n)。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; string s; cin >> n >> s; int fact[10] = {1}; for (int i = 1; i <= n; i++) fact[i] = fact[i - 1] * i; int rank = 1; for (int i = 0; i < n; i++) { int c = 0; for (int j = i + 1; j < n; j++) if (s[j] < s[i]) c++; rank += c * fact[n - 1 - i]; } cout << rank << "\n"; return 0; }
- 1