zoukankan      html  css  js  c++  java
  • HDUOJ 2018

    母牛的故事

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 21477    Accepted Submission(s): 10359


    Problem Description
    有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
     

    Input
    输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
    n=0表示输入数据的结束,不做处理。
     

    Output
    对于每个测试实例,输出在第n年的时候母牛的数量。
    每个输出占一行。
     

    Sample Input
    2 4 5 0
     

    Sample Output
    2 4 6
     
    除了hanoi塔和大数阶乘,这是我遇到的第一个递归问题,虽然简单,但也在此留念。
    分析:
    设第n年有f(n)头牛,易分析出f(n)由f(n-1)和f(n-3)决定。第n-1年有f(n-1)头牛,假设这些牛中第n年刚好能生育的牛有s头,第n年能生育但不是刚好能生育的牛有t头,第n年不能生育的有k头,故f(n)=2*s+2*t+k=(s+t+k)+(s+t)=f(n-1)+(s+t),又设第n-3年的牛中该年新生的牛有p头,非新生的牛有q头,新生的p头牛在第n年刚好能生育,故p=s。假设一头牛是q中的一头,则它必在第n年为t中的一头,反之亦然,得q=t,故s+t=p+q=f(n-3),因此f(n)=f(n-1)+f(n-3)。并且由题意得f(i)=i(i=1,2,3)。
    如果用函数递归耗时会比较多,由于n<55 , 因此用数组存储值。

    #include <iostream>
    using namespace std;
    int main()
    {
    	int a[55]={0,1,2,3},i,n;
    	for(i=4;i<=54;i++) a[i]=a[i-1]+a[i-3];
    	while(cin>>n)
    	{
    		if(n==0) break;
    		else cout<<a[n]<<endl;
    	}
    	return 0;
    }



  • 相关阅读:
    tornado开发学习之2.输入输出,数据库操作,内置模板,综合示例
    使用Python读取和写入mp3文件的id3v1信息
    在CentOS中部署Python和配置PyCharm开发环境
    Quartz Cron 表达式(时间格式的写法)
    使用Atomikos Transactions Essentials实现多数据源JTA分布式事务
    Grub4dos 硬盘引导 iso 文件
    NFS配置
    C++程序加载Flash动画
    在boost.foreach中操作迭代器
    WebContents类
  • 原文地址:https://www.cnblogs.com/cszlg/p/2910544.html
Copyright © 2011-2022 走看看