HDU1027 Ignatius and the Princess II 【next_permutation】【DFS】
2016-01-20 14:16
507 查看
Ignatius and the Princess II
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4571 Accepted Submission(s): 2733
[align=left]Problem Description[/align]
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?
[align=left]Input[/align]
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.
[align=left]Output[/align]
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.
[align=left]Sample Input[/align]
6 4 11 8
[align=left]Sample Output[/align]
1 2 3 5 6 4 1 2 3 4 5 6 7 9 8 11 10
[align=left]Author[/align]
Ignatius.L
题意:求数列1~n的第m个全排列。
题解:用STL里的next_permutation和DFS都可解,但时间复杂度就相去甚远了。
STL:耗时31ms#include <cstdio> #include <algorithm> using namespace std; int arr[1002]; int main() { int n, m, i; while(scanf("%d%d", &n, &m) != EOF){ for(i = 0; i < n; ++i) arr[i] = i + 1; while(--m) next_permutation(arr, arr + n); for(i = 0; i < n; ++i) if(i != n - 1) printf("%d ", arr[i]); else printf("%d\n", arr[i]); } return 0; }DFS:耗时390ms
#include <stdio.h> #include <string.h> #define maxn 1002 int vis[maxn], n, m, arr[maxn], count, ok; void PRINT() { for(int i = 1; i <= n; ++i) if(i != n) printf("%d ", arr[i]); else printf("%d\n", arr[i]); } void DFS(int k) { if(k > n) return; for(int i = 1; i <= n; ++i){ if(!vis[i]){ vis[i] = 1; arr[k] = i; if(k == n && m == ++count){ PRINT(); ok = 1; return; } DFS(k + 1); vis[i] = 0; if(ok) return; } } } int main() { while(scanf("%d%d", &n, &m) != EOF){ memset(vis, 0, sizeof(vis)); ok = count = 0; DFS(1); } return 0; }
相关文章推荐
- Oracle安装配置流程
- <%= %>和${}使用差异
- javascript 中instanceof的用法
- Kindeditor在JSP项目中的应用
- [Application] oh-my-zsh & iterm2
- 设计模式--单例模式
- 行列元素 eg:img之间明明没距离,为什么还是有间距
- Volley ImageLoader加载本地图片特别版
- paper 12:机器学习常见算法分类汇总
- 2016/1/20 总结构建子类对象时的顺序
- Java [Leetcode 328]Odd Even Linked List
- 无法作为数据库主体执行,因为主体 "dbo" 不存在、无法模拟这种类型的主体,或您没有所需的权限。 已将数据库上下文更改为
- centos下网络配置方法(网关、dns、ip地址配置)
- 一个网站的开发流程
- Web的脆弱性:各种注入、攻击
- Quartz2.x(包括1.x)开发(调度器数据保存在持久层)出现的问题
- Quartz2.x(包括1.x)开发(调度器数据保存在持久层)出现的问题
- ECUG 2015|许式伟:对编程语言的选择无关阵营,关乎品味
- 使用 Heka 导入自定义的nginx日志到Elasticsearch
- CSS总结