HDU 5366 The mook jong——BestCoder Round #50(div.1 div.2)
2015-08-08 23:25
267 查看
The mook jong
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Problem Description
![](http://bestcoder.hdu.edu.cn/data/images/C613-1001-1.jpg)
ZJiaQ want to become a strong man, so he decided to play the mook jong。ZJiaQ want to put some mook jongs in his backyard. His backyard consist of n bricks that is 1*1,so it is 1*n。ZJiaQ want to put a mook jong in
a brick. because of the hands of the mook jong, the distance of two mook jongs should be equal or more than 2 bricks. Now ZJiaQ want to know how many ways can ZJiaQ put mook jongs legally(at least one mook jong).
Input
There ar multiply cases. For each case, there is a single integer n( 1 < = n < = 60)
Output
Print the ways in a single line for each case.
Sample Input
1 2 3 4 5 6
Sample Output
1 2 3 5 8 12
/************************************************************************/
附上该题对应的中文题
The mook jong
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
ZJiaQ为了强身健体,决定通过木人桩练习武术。ZJiaQ希望把木人桩摆在自家的那个由1*1的地砖铺成的1*n的院子里。由于ZJiaQ是个强迫症,所以他要把一个木人桩正好摆在一个地砖上,由于木人桩手比较长,所以两个木人桩之间地砖必须大于等于两个,现在ZJiaQ想知道在至少摆放一个木人桩的情况下,有多少种摆法。
输入描述
输入有多组数据,每组数据第一行为一个整数n(1 < = n < = 60)
输出描述
对于每组数据输出一行表示摆放方案数
输入样例
1 2 3 4 5 6
输出样例
1 2 3 5 8 12
/****************************************************/
出题人的解题思路:
令f[i]为最后一个木人桩摆放在i位置的方案,令s[i]为f[i]的前缀和。很容易就能想到f[i]=s[i-3]+1,s[i]=s[i-1]+f[i],而s
即是所求答案。本题唯一一个值得注意的点就是当n接近60时会爆int。
貌似这道题好多人都用了dp(动态规划)的思想,不过我并没有想到用dp来做,如果你还记得高中学过的排列组合的话,你应该知道相同元素之间该怎么处理。首先我们可以确定的是,因为每两个木人桩之间的地砖必须大于等于2个,所以木人桩的个数k需满足k+2*(k-1)<=n,即k<=(n+2)/3,n才60,k最多20,暴力妥妥的。而k=i的情况有多少种如何计算呢,刚开始想到的是隔板法,但是貌似怎么隔都不对的样子,不过仔细想想就会发现其中的奥妙所在。我们以n=7,k=2时的情况为例做一个说明。
因为两个木人桩之间的地砖数至少需要两个,那我只需先取出这两块地砖,那就相当于在剩下的5个地砖上放2个木人桩,即
,再将取出的地砖放回去就是所求的解,所以对应的木人桩的个数k,我们只需加上
即可。而组合数可以先预处理。
需要注意的一点是n接近60的时候会超int型,所以__int64或者long long走起吧
上代码了,有什么问题可以留下评论,谢谢
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<math.h> #include<vector> #include<map> #include<set> #include<cmath> #include<string> #include<algorithm> #include<iostream> #define exp 1e-10 #define ll __int64 using namespace std; const int N = 65; const int inf = 1000000000; const int mod = 1000000007; __int64 c ; int main() { int n,m,i,j; __int64 k; c[1][0]=c[1][1]=1; for(i=2;i<=60;i++) for(j=0;j<=i;j++) if(j==0) c[i][j]=1; else c[i][j]=c[i-1][j-1]+c[i-1][j]; while(~scanf("%d",&n)) { m=(n+2)/3;k=0; for(i=1;i<=m;i++) k+=c[n-(i-1)*2][i]; printf("%I64d\n",k); } return 0; }菜鸟成长记
相关文章推荐
- PyQt5初级教程--PyQt5中部件[8/13]
- [LeetCode]Multiply Strings
- jquery代码阅读之jquery.type
- JavaStep --- 3. 读取输入
- [LeetCode]Combination Sum II
- HDU 5365(计算几何)
- 游戏交互设计中的114条原则
- JQuery中如何处理键盘事件
- 花瓶插花
- 对一个程序的思考6(指针与指针的指针)
- hdu 5366 The mook jong 动态规划(BC 50 C题)
- Android 内存泄露之------Thread
- LeetCode 18 4Sum K-sum系列
- 数组去重复
- spring-mvc-redis
- ACM中关于Output Limit Exceeded和Time Limit Exceeded
- 深入理解Aop编程思想
- 编写jQuery插件
- Hibernate学习之hibernate执行顺序
- CentOS6编译安装LAMP:编译安装 PHP5