ACM-简单题之Ignatius and the Princess II——hdu1027
转载请注明出处:http://blog.csdn.net/lttree
Ignatius and the Princess II
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4436 Accepted Submission(s): 2642
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?
6 4
11 8
1 2 3 5 6 4
1 2 3 4 5 6 7 9 8 11 10
题目: pid=1027">http://acm.hdu.edu.cn/showproblem.php?pid=1027
这道题,题意就是求 N的第m种排列。
应该属于组合数学中的一种。刚好之前做过康托展开,就感觉能够用康托展开来做。
(康拓展开详情可戳→http://blog.csdn.net/lttree/article/details/24798653)
可是,我看了看数据范围就被吓到了, N and M(1<=N<=1000, 1<=M<=10000)。
阶乘,最多仅仅是10。怎么N能够到1000.。。。
细致一想就能够发现,M最大为10000。也就是说。最多也就仅仅有后面8个数才会动。前面不会动的。
由于1~8的阶乘为:1,2,6,24,120,720,5040,40320.
8的阶乘为40320>10000 10000种以内的排列序,仅仅能在最后8个变化。
换种说法,不管N为多少,当N>8时,前N-8是不变的。仅仅有后面8个在变化。
比如:N为11,那么前面3个数为1 2 3顺序一定不变。变化的永远是后面4~11
思路想出来后。解决这道题就不算太难。
本来我用的是,边算遍输出。可是总是PE,可能还是有地方没想到吧。
就直接将答案存在一个ans数组里。最后一起输出,就AC了。
/****************************************
*****************************************
* Author:Tree *
*From :http://blog.csdn.net/lttree *
* Title : Ignatius and the Princess II *
*Source: hdu 1027 *
* Hint : 康托展开 *
*****************************************
****************************************/ #include <iostream>
using namespace std;
int fac[]={1,1,2,6,24,120,720,5040,40320};
// 存储答案
int ans[10001],len;
// 康托展开的逆 n为要对几位数排序,k为第几个数,num为这n个数应该从多少開始
void reverse_kangtuo(int n,int k,int num)
{
int i, j, t, vst[11]={0};
char s[11]; --k;
for (i=0; i<n; i++)
{
t = k/fac[n-i-1];
for (j=1; j<=n; j++)
if (!vst[j])
{
if (t == 0) break;
--t;
}
s[i] = '0'+j;
vst[j] = 1;
k %= fac[n-i-1];
}
// 排序后的赋给答案数组
for(int kk=0;kk<n;++kk)
ans[len++]=s[kk]-'1'+num;
} int main()
{
int n,m;
int i,j,temp1,temp2;
while( cin>>n>>m )
{
i=1;
len=0;
if( n>8 )
{
temp1=n%8;
temp2=(n/8-1)*8;
// 对应答案赋值
for(;i<=temp1;++i)
ans[len++]=i;
for(j=0;j<temp2;++j,++i)
ans[len++]=i;
reverse_kangtuo(8,m,i);
}
else reverse_kangtuo(n,m,i); // 输出,注意最后一个数后面没有空格
for(i=0;i<len-1;++i)
cout<<ans[i]<<" ";
cout<<ans[len-1]<<endl;
}
return 0;
}
ACM-简单题之Ignatius and the Princess II——hdu1027的更多相关文章
- ACM-简单的主题Ignatius and the Princess II——hdu1027
转载请注明出处:http://blog.csdn.net/lttree Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Othe ...
- hdu1027 Ignatius and the Princess II (全排列 & STL中的神器)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1027 Ignatiu ...
- Ignatius and the Princess II(全排列)
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- (全排列)Ignatius and the Princess II -- HDU -- 1027
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1027 Ignatius and the Princess II Time Limit: 2000/100 ...
- HDU 1027 Ignatius and the Princess II(求第m个全排列)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1027 Ignatius and the Princess II Time Limit: 2000/10 ...
- HDU 1027 Ignatius and the Princess II(康托逆展开)
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- HDU1027 Ignatius and the Princess II 【next_permutation】【DFS】
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- Ignatius and the Princess II
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- (next_permutation)Ignatius and the Princess II hdu102
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
随机推荐
- Android下Affinities和Task
源文链接:http://appmem.com/archives/405 本文参考了官方Dev Guide文档,简单介绍Android下的affinities和任务(task). 1.Activity和 ...
- JavaScript 字符串函数 之查找字符方法(一)
1.JavaScript查找字符方法 首先看一张 有关字符串函数的查找字符的方法图 接下里补充里面的方法说明 2.charAt() charAt() 方法返回字符串中指定位置的字符 语法 ...
- HTMl5的sessionStorage和localStorage(转)
html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage. sessionStorage用于本地存储一个会话(session)中的数据,这些数据只 ...
- sealed 修饰符
当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承. 在下面的示例中,类 B 从类 A 继承,但是任何类都不能从类 B 继承. class A {} sealed class B ...
- iOS_SN_BlueTooth( 一)蓝牙相关基础知识
原文 http://www.cocoachina.com/ios/20150915/13454.html 作者:刘彦玮 蓝牙常见名称和缩写 MFI ======= make for ipad ,ip ...
- Jobs定时器 - Quartz
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...
- system进程启动普通用户进程调研
system进程启动普通用户进程 关键函数是CreateProcessAsUser 主要思路是先取得目的用户的token,然后用上面的函数启动 1.从explorer中取token BOOL GetT ...
- python代码风格规范
类注释模板: :: class AnotherClass: """ 类注释 """ def method(self, arg1, arg2, ...
- 文件:因为懂你,所以永恒 - 零基础入门学习Python028
文件:因为懂你,所以永恒 让编程改变世界 Change the world by program 因为懂你,所以永恒 大多数的程序都遵循着:输入->处理->输出的模型,首先接受输入数据,然 ...
- 帮小黎解决问题C++巩固获得数字每个位置上的数
现在有一个数字 a= 12345; 想要取得这个数字上的没一个数字 使用 除法 +模除 的方法可以获得 原理:除(/)得到的是商 模除(%)的到的是余数 采用这种方式,先将要求的数的某一位 ...