C++之小学奥数(2)
来源:互联网 发布:中国m2月度数据 编辑:程序博客网 时间:2024/04/28 04:52
求出第k小排列
题目描述
给出两个正整数n,k(n<8,k<n!)求出第k小的n个数的排列。 //也就是说要求全排列出来后的第k个数
输入
只有一行:两个整数,n(n<8),k小于n的阶乘
输出
输出该排列
样例输入
4 3
样例输出
1324
题目分析
当n==4时,所有的全排列(数)如下:
1234,1243,1324,1342,1423,1432;
2134,2143,2314,2341,2413,2431;
3124,3142,3214,3241,3412,3421;
4123,4132,4213,4231,4312,4321.
所以输出的是第k(k==3)小的1324。
思路解析
首先运用全排列思想定义search函数,其次定义output函数使total进行计数,若total==k(即该排列是第k小的时候),输出答案。
实现代码
代码如下:
#include<cstdio> #include<cstring> bool check[8]; int num[8]; // int n,k,total; //n,k即题目要求的n,k;total计算当前是第几个排列 void output(){ total++; //计算当前是第几个排列 if(total==k) { for(int i=1;i<=n;i++) //输出第k大的数 printf("%d",num[i]); }} void search(int x) { for(int i=1;i<=n;i++) if(!check[i]) //判断该数是否被标记 { num[x]=i; //存储方案 check[i]=1; //标记该数 if(x==n) output(); else search(x+1); check[i]=0; //回溯 /*num[x]=0;*/ //可省略 } } main() { scanf("%d%d",&n,&k); search(1); }
感想总结
全排列的思想真的很方便,能够帮助我们完成很多题。
触类旁通
题目描述
给出两个正整数n,k(n<8,k<n!)求出第k大的n个数的排列。
输入
只有一行:两个整数,n(n<8),k小于n的阶乘
输出
输出该排列
样例输入
4 3
样例输出
4231
阅读全文
1 0
- C++之小学奥数(2)
- 小学奥数之循环小数
- 小学奥数公式2
- C++之小学奥数(1)
- 小学奥数
- 小学奥数公式1
- 吐槽小学奥数
- 小学奥数(下)
- 小学奥数主要内容汇总!
- 小学奥数先锋 2006 bt
- 关于一道小学奥数题目
- Openjudge小学奥数--7834 分成互质组!
- 行测-数量-小学奥数知识体系
- 【小学奥数】【ExBsgs】垃圾计算机
- 2017小学奥数培训机构排名
- 小学奥数平均数经典问题汇总
- [来源未知][小学奥数]组合数取模
- 小学奥数10道经典题
- 路由器web界面分析(二)---web和底层如何交互
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—A qwb与支教
- 人工智能与机器学习速查表
- 两道交互题
- maven编译项目时出错(1)
- C++之小学奥数(2)
- Android mediaplayer
- SpringMVC面试总结
- android TextInputEditText,TextInputEditText
- MapReduce实例----统计平均成绩
- (三)c++和javascript实现希尔排序
- 549. Binary Tree Longest Consecutive Sequence II
- visual stdio缺少gdi32的解决办法
- GreenDao配置时异常