zoukankan      html  css  js  c++  java
  • 第39阶台阶 蓝桥杯

    欢迎访问我的新博客:http://www.milkcu.com/blog/

    原文地址:http://www.milkcu.com/blog/archives/1370580480.html

    标题:第39阶台阶 - 蓝桥杯

    内容:2013年第四届蓝桥杯全国软件大赛预赛第三题。

    作者:MilkCu(http://blog.csdn.net/milkcu

    题目描述

    题目标题: 第39级台阶
        小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
        站在台阶前,他突然又想着一个问题:
        如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?
        请你利用计算机的优势,帮助小明寻找答案。

    要求提交的是一个整数。
    注意:不要提交解答过程,或其它的辅助说明文字。

    分析

    该情景可简化为39与0和1的关系问题,还有一个限制条件,一共要走偶数步。这道题可以有两种思路,递归与排列组合,代码都不长,重在思考过程。

    递归思想

    # include <stdio.h>
    int n = 0;
    int fun(int r, int s)
    {
    	if(r < 0) {
    		return 0;
    	}
    	if(r == 0 && s % 2 == 0) {
    		n++;
    		return 0;
    	}
    	for(int i = 1; i <= 2; i++) {
    		fun(r - i, s + 1);
    	}
    }
    int main(void)
    {
    	fun(39, 0);
    	printf("%d\n", n);
    	return 0;
    }

    其中,r为remaider的缩写,表示剩余的台阶数;s为step的缩写,表示已经走的步数。我用这种方法的时候,一直在想为什么会有“s % 2 == 0”这个限制条件,原来这是题目的限制条件。

    排列组合思想

    # include <stdio.h>
    int c(int m, int n)
    {
    	int cmn = 1;
    	for(int i = 0; i < n; i++) {
    		cmn = cmn * (m - i) / (i + 1);
    	}
    	return cmn;
    }
    int main(void)
    {
    	int n = 0;
    	for(int i = 1; i <= 19; i += 2) {
    		n += c(39 - i, i);
    	}
    	printf("%d\n", n);
    	return 0;
    }

    完全转化为数学问题,实际上就是:

    n = c(38, 1) + (36, 3) + ... + c(20, 19)

    最后答案

    51167078

    (全文完)

  • 相关阅读:
    Linux Shell参数替换
    Linux下redis的安装
    Make 命令教程
    linux环境变量 export命令详解
    Java分布式应用技术架构介绍
    centos mysql忘记密码
    <context:component-scan>使用说明
    Spring <context:annotation-config/> 解说
    [Visio]直线工具和连接线工具的区别
    [Visual Studio Code] 字体设置
  • 原文地址:https://www.cnblogs.com/milkcu/p/3808925.html
Copyright © 2011-2022 走看看