1 条题解
-
0
自动搬运
来自洛谷,原作者为

Wy_x
༼ つ ◕_◕ ༽つ 或者,赢下所有!搬运于
2025-08-24 22:40:46,当前版本为作者最后更新于2022-10-24 19:41:42,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
如果你看出来方法了,那这道题就是一道裸的全排序题。
思路:
-
因为数据范围是 ,可以放心使用时间复杂度为 的全排列函数。题目由小到大编号,应选择
next_permutation。 -
ans应该从 开始计数。 -
每进行一次全排列后就判断全排列的结果是否和给出的字符串 相同,两种情况:
- 如果相同,则退出循环,输出现在
ans的值。 - 否则,
ans加一,同时继续全排列当前结果,直到条件 成立。
- 关于
next_permutation:不懂请移步这里,根据需要自学。
代码:
#include<bits/stdc++.h> using namespace std; string a; char c[100]; int ans=0; // 1 ≤ n ≤ 10 //放心使用时间复杂度 O(n!) 的全排列函数 //不会超时 int main() { cin>>a; int l=a.size(); for(int i=0;i<l;i++) c[i]='a'+i; //因为 a 的长度 == 字符种类,进行初始化 //全排列我习惯字符数组,string 的我不会 while(true) { bool flag=1; for(int i=0;i<l;i++) { //判断两个字符串是否相等 if(a[i]!=c[i])//不相等 { flag=0;//标记 break;//退出循环 } } if(flag) break; //如果没有被标记过,就退出循环输出答案 ans++; //注意 ans 要从 0 开始计数, //所以加法操作要在 break 后 next_permutation(c,c+l); //求下一个全排列 } cout<<ans; //输出编号 return 0; } -
- 1
信息
- ID
- 5935
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者