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
题目: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 -- 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 ( ...
- 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 ( ...
随机推荐
- poj2531
看了一下0ms,16ms,100ms左右过了的代码,思维量对我来说比較大,不是非常easy理解. 我的作法: 用并查集算权值和. 用dfs枚举两个点集的全部可能,因为是全然图,枚举一半的点就可以. # ...
- [ACM] 九度OJ 1553 时钟
时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:1733 解决:656 题目描写叙述: 如图,给定随意时刻,求时针和分针的夹角(劣弧所相应的角). 输入: 输入包括多组測试数据.每组測试数 ...
- MD5加密以及验证加密-加盐
加密与解密算法: /// <summary> /// 签名字符串 32位 /// </summary> /// <param name="input" ...
- 2015 Multi-University Training Contest 8
Hdu 5385 The path 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5385 题意:有一个联通的有向图,d(x)用来记录从1点到x点的最短 ...
- win7+Powerpoint2007下设置演讲者视图,两步搞定
步骤1: 步骤2: 这样,你就可以对着ppt的备注讲解了,且用户看不到你的备注以及你的电脑桌面.cool!
- 让AllocateHwnd接受一般函数地址作参数(105篇博客)
http://www.xuebuyuan.com/1889769.html Classes单元的AllocateHWnd函数是需要传入一个处理消息的类的方法的作为参数的,原型: function Al ...
- Lucene.Net 2.3.1开发介绍——附录一、如何下载Lucene.Net的各种版本
原文:Lucene.Net 2.3.1开发介绍--附录一.如何下载Lucene.Net的各种版本 首先,你需要一个svn客户端.TortoiseSVN非常好用,可以从官方网站下载.下载地址:http: ...
- php中include文件变量作用域的研究
原文:php中include文件变量作用域的研究 在php中我们有时候需要include一个文件.比如我前段时间在写一个框架的时候,打算用原生的php作为模板,然后写一个display方法引入模板文件 ...
- Java调用cmd命令 打开一个站点
使用Java程序打开一个站点 近期做了个东西使用SWT技术在一个client程序 须要升级时在提示升级 点击窗口上的一个连接 打开下载网页 花费了我非常长时间 用到了把它记录下来 怕是忘记,须要时能 ...
- 在SharePoint 2010中部署RBS (转)
一.RBS(Remote BLOB Storage)简单介绍 在SharePoint的大部分企业应用案例中,SharePoint都是要承担着非常繁重的文件管理工作,这些文件类型包含了Word文档,Ex ...