ACM刷题之路(一)第K个排列问题 Ignatius and the Princess II

简介: ACM刷题之路(一)第K个排列问题 Ignatius and the Princess II

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1027

Problem Description

Now our hero finds the door to the BEelzebub feng5166. He opens the door and finds feng5166 is about to kill our pretty Princess. But now the BEelzebub has to beat our hero first. feng5166 says, "I have three question for you, if you can work them out, I will release the Princess, or you will be my dinner, too." Ignatius says confidently, "OK, at last, I will save the Princess."


"Now I will show you the first problem." feng5166 says, "Given a sequence of number 1 to N, we define that 1,2,3...N-1,N is the smallest sequence among all the sequence which can be composed with number 1 to N(each number can be and should be use only once in this problem). So it's easy to see the second smallest sequence is 1,2,3...N,N-1. Now I will give you two numbers, N and M. You should tell me the Mth smallest sequence which is composed with number 1 to N. It's easy, isn't is? Hahahahaha......"

Can you help Ignatius to solve this problem?

 

Input

The input contains several test cases. Each test case consists of two numbers, N and M(1<=N<=1000, 1<=M<=10000). You may assume that there is always a sequence satisfied the BEelzebub's demand. The input is terminated by the end of file.

 

Output

For each test case, you only have to output the sequence satisfied the BEelzebub's demand. When output a sequence, you should print a space between two numbers, but do not output any spaces after the last number.

 

Sample Input


                 

6 4 11 8

 

Sample Output


                 

1 2 3 5 6 4 1 2 3 4 5 6 7 9 8 11 10


题目意思:

输入n,m;n是数字的个数,m是求从小到大第m个排列。

如n = 4,m = 2,就是1,2,3,4这四个数第二个排列,即1,2,4,3。

如n = 3 , m = 3,就是1,2,3这六个数的第三个排列,就是2,1,3。


题解:

1. 使用next_permutation()函数:

使用时第一个参数代表首地址,第二个参数代表尾地址,比如next_permutation(a,a+n).求第M小的数列,只要让原来从小到大的数列执行m-1次next_permutation()函数即可,这题使用这个方法完全可以AC,只要93ms,但是数据范围如果很大就会超时。就像蔡老师说的“程序员是很懒的”,在使用函数能解决的情况下,就使用这个函数A题。

1. #include <iostream>
2. #include <cstring>
3. #include <algorithm>
4. using namespace std;
5. 
6. #define N 1002
7. int num[N];
8. int main()
9. {
10.   int n, m;
11.   while (~scanf("%d%d", &n, &m))
12.   {
13.     memset(num, 0, sizeof(num));
14.     for (int i = 0; i < n; i++){
15.       num[i] = i + 1; // 初始化为1 到 n
16.     }
17.     for (int i = 1; i < m; i++){
18.       next_permutation(num, num + n);//反复求下一个排列
19.     }
20.     for (int i = 0; i < n - 1; i++) {
21.       printf("%d ", num[i]);//输出
22.     }
23.     printf("%d\n", num[n - 1]);
24.   }
25.   return 0;
26. }

2.使用阶乘的思想

比如n = 5, m = 6(提示:6 = 3 ! ),只会对(3 + 1 )位数字发生变化,前面第一位数字不会改变。

比如n = 100   m = 24(提示:24 = 4!) ,只会对后(4+1)位数字发生变化,前面95个数字依旧不会改变。

这是m刚刚好为一个数的阶乘的情况,那么重点来了,如果不等于,我们可以拆开来 ,1的阶乘为1。

 

 

代码用阶乘讨论

1. #include<stdio.h>  
2. #include<string.h>  
3. 
4. int a[10] = { 1,1,2,6,24,120,720,5040 };//阶乘数组
5. int b[10];
6. 
7. int main()
8. {
9. int n, m, i, k, t;
10. while (~scanf("%d%d", &n, &m)){
11. for (i = 1; i <= n - 8; i++) {
12. printf("%d ", i);
13.         }
14. for (k = 0; i <= n; i++) {
15.             b[k++] = i;
16.         }
17. if (n > 8) n = 8;
18. for (i = n; i > 1; i--){
19.             t = (m - 1) / a[i - 1];
20. for (k = 0; k < 8 && k < n; k++){
21. if (b[k] && t == 0){
22. printf("%d ", b[k]);
23.                     b[k] = 0;
24. break;
25.                 }
26. else if (b[k]) t--;
27.             }
28.             m = (m - 1) % a[i - 1] + 1;
29.         }
30. for (k = 0; k < 8 && k < n; k++) {
31. if (b[k]) printf("%d\n", b[k]);
32.         }
33.     }
34. return 0;
35. }


相关文章
|
SQL 存储 缓存
MySQL - 一文了解MySQL的基础架构及各个组件的作用
MySQL - 一文了解MySQL的基础架构及各个组件的作用
1062 0
|
安全 BI
ERP系统的培训与用户支持:确保系统高效使用与用户满意度
【7月更文挑战第29天】 ERP系统的培训与用户支持:确保系统高效使用与用户满意度
755 0
|
JavaScript 前端开发 开发者
Vue2、Vue3封装组件
封装组件有以下几点好处: 简化开发过程:在开发过程中,我们经常会遇到一些相似的功能需求,比如表单验证、数据展示等。 提高代码的可读性和可维护性:组件封装将代码块封装成一个整体,使代码结构更加清晰,逻辑更加明确。开发者只需关注组件的输入和输出,无需关心其内部实现细节。同时,由于组件是独立的,修改一个组件不会影响其他组件,使得代码的维护更加方便。
|
Python Windows
基于Windows下Pycharm和Anaconda的python虚拟环境连接配置及更换项目虚拟环境方法
基于Windows下Pycharm和Anaconda的python虚拟环境连接配置及更换项目虚拟环境方法
958 0
基于Windows下Pycharm和Anaconda的python虚拟环境连接配置及更换项目虚拟环境方法
|
存储 缓存 网络协议
3 个步骤教你轻松修复“WordPress开发重定向过多”
ordPress建站开发中,选择重定向设置之后,有时候多次重定向后就受到提示,那么如何修复“WordPress开发重定向过多”,北京六翼开源的工程师教你3步轻松修复这个问题,在下面的步骤中,您将学习如何识别冲突的重定向并快速修复您网站上的重定向循环。
3 个步骤教你轻松修复“WordPress开发重定向过多”
|
JavaScript 前端开发 网络架构
朋友,柯里化(Currying)了解一哈
greet获取了它应获取的参数,curry也停止了递归处理。并且,我们也获得了想要的结果Hello,范北宸。 其实利用curry对greet经过如上处理之后,现在处理之后的函数能够同时接收任意(n≥0)的参数。
204 0
|
Java 关系型数据库 Linux
首次使用 linux 阿里云服务器【入门及使用】
上午编辑的文章 下午更新下 安装环境 因为服务器默认 linux 系统,所以这里讲怎么配置 linux 云服务环境。我第一次使用的时候,还以为是要去安装一个界面化桌面,以便我这个命令小白可以操作。
首次使用 linux 阿里云服务器【入门及使用】
|
前端开发 C#
【WPF】MVVM动态修改Bingding的另一种思路——用Style样式
原文:【WPF】MVVM动态修改Bingding的另一种思路——用Style样式 问题场景: 界面上有个ListBox控件,它的内容Item绑定了一个列表,即 ItemsSource =”{Binding StudentList}”。
1690 0