码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 5366-The mook jong(组合数学)

时间:2015-08-09 17:11:37      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:数学   组合数学   规律   思维   

题目地址:HDU 5366
题意:
问题描述
ZJiaQ为了强身健体,决定通过木人桩练习武术。ZJiaQ希望把木人桩摆在自家的那个由1*1的地砖铺成的1*n的院子里。由于ZJiaQ是个强迫症,所以他要把一个木人桩正好摆在一个地砖上,由于木人桩手比较长,所以两个木人桩之间地砖必须大于等于两个,现在ZJiaQ想知道在至少摆放一个木人桩的情况下,有多少种摆法。
输入描述
输入有多组数据,每组数据第一行为一个整数n(1 < = n < = 60)
输出描述
对于每组数据输出一行表示摆放方案数
输入样例
1
2
3
4
5
6
输出样例
1
2
3
5
8
12

思路:首先我们可以确定的是,因为每两个木人桩之间的地砖必须大于等于2个,所以木人桩的个数k需满足k+2*(k-1)<=n,即k<=(n+2)/3。然后我们来找砖数和木人桩之间的关系。
Eg:n=7,k=2时,因为2个木人桩之间的地砖数至少需要2个,那么我只需要先取出这2块地砖,那么就相当于剩下的5个地砖上放2个木人桩,即C(5,2)=10,然后再将取出的地砖放回去就是所求解,所以对应的木人桩数k,我们只需要加上C(n-2*(k-1),k)即可。

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef __int64  LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
const int maxn=70;
LL c[maxn][maxn];
LL C()
{
    int i,j;
    for(i=0;i<maxn;i++){
        c[i][0]=1;
        c[i][i]=1;
    }
    for(i=1;i<maxn;i++)
    for(j=1;j<maxn;j++)
    c[i][j]=c[i-1][j]+c[i-1][j-1];
}
int main()
{
    int n;
    C();
    while(~scanf("%d",&n)){
        int cnt=(n+2)/3;
        LL sum=0;
        for(int i=1;i<=cnt;i++){
            sum+=c[n-2*(i-1)][i];
        }
        printf("%I64d\n",sum);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 5366-The mook jong(组合数学)

标签:数学   组合数学   规律   思维   

原文地址:http://blog.csdn.net/u013486414/article/details/47377301

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!