首页 > 试题广场 >

母牛的故事

[编程题]母牛的故事
  • 热度指数:5113 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

输入描述:
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。


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

输入

2<br/>4<br/>5

输出

2<br/>4<br/>6

F(1) = 1,F(2) = 2,F(3)= 3, F(4)= 4,
从第4年后(即第五年),大母牛生的小母牛开始可以生小牛,F(5)=F(4)+F(2),即F(n)= F(n-1)+F(n-3),意思为去年的牛数量+可以生小牛的牛的数量=现在的数量
由于又多组数据,可以直接打表,打表的时间复杂度为O(n)(n为表长),加Q次查询,时间复杂度为O(n+Q).

3 参考代码

/*
 * 详解:https://blog.csdn.net/qq_33375598/article/details/104607549
 */
#include <cstdio>

const int MAXN = 60;
int ans[MAXN]= {0,1,2,3};

int main(int argc, char const *argv[]){
    int n;
    for (int i = 4; i < 55; ++i) {//打表
        ans[i] = ans[i-1] + ans[i -3];//去年的牛+出生后的牛生的小牛
    }
    while(scanf("%d", &n) != EOF){
        printf("%d\n", ans[n]);
    }
    return 0;
}
发表于 2020-03-02 11:14:47 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int[] numbers=new int[85];
        numbers[1]=1;
        numbers[2]=2;
        numbers[3]=3;
        numbers[4]=4;
        while(sc.hasNext()){
            int n=sc.nextInt();
            for(int i=5;i<85;i++){
                numbers[i]=numbers[i-1]+numbers[i-3];
            }
            System.out.println(numbers[n]);
        }
    }
}

发表于 2018-09-30 00:00:14 回复(0)
/*
 * =====================================================================================
 *
 *       Filename:  07母牛的故事.cpp
 *
 *        Version:  1.0
 *        Created:  2018/09/24 11:11:55
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Covfefe
 *   Organization:    Fs-studio
 *   
 *             idea:  天    数:    1    2    3    4    5    6    7    8
 *                    总数x(n):    1    2    3    4    6    9    13    19
 *                    容易观察发现从第4天开始,x(n) = x(n-1) + x(n-3)
 *
 * =====================================================================================
 */

#include <stdio.h>
#include <iostream>
using namespace std;
#define FOR(i,n) for(i = 3; i < n; i++)

int main()
{
    int n, i, x[56];
    x[0] = 1;
    x[1] = 2;
    x[2] = 3;
    FOR(i, 55)
        x[i] = x[i - 1] + x[i - 3];
    while (cin >> n)
    {
        cout << x[n - 1] << endl;
    }
    return 0;
}
发表于 2018-09-24 11:21:36 回复(0)
//水题
#include <stdio.h>
voidDataInit(long*a);
int main()
{
    long a[55] = {0, 1, 2, 3};
    int n, i;
    DataInit(a);
    while(scanf("%d", &n)!=EOF)
    {
        printf("%ld\n", a[n]);
    }
    return0;
}
 
voidDataInit(long*a)
{
    int i;
    for(i=4;i<55;i++)
    {
        a[i] = a[i-1] + a[i-3];
    }
}

发表于 2017-11-26 22:29:22 回复(0)
a[n] = a[n-1] + a[n-3];
a[n-3] 为从a[n-1]到a[n]年后增加的母牛数量,即四年前的母牛总数就是所有会生新的母牛的数量
发表于 2015-07-06 20:06:10 回复(0)

python解法

关键是找到递推公式a[n]=a[n-1]+a[n-3]

import sys

def cowCountAtSomeYear(n):
    arr=[1,2,3,4]
    while len(arr)<n:
        arr.append(arr[-1]+arr[-3])
    return arr[n-1]


for i in sys.stdin.readlines():
    print(cowCountAtSomeYear(int(i)))
发表于 2017-11-17 10:09:41 回复(0)
一开始的思想是第n年有几头,然后再把n年的加起来。时间复杂度一下子高了很多,还有就是系统对c函数的支持不是很好,
就没有自定义函数。都在main里面了,最后还是要审题,既然已经说了n的范围 就可以都算出来。这样后期处理就会很快,
而且一定要发现是多组数据,我就一开始看成了一组。结果晕了半天。

#include <stdio.h>

intmain()
{
 
    intinput;
    inta[60] = {0};
    inti;
    a[1] = 1;
    a[2] = 2;
    a[3] = 3;
    a[4] = 4;
    for(i = 5;i<56;i++){
        a[i] = a[i-1]+a[i-3];
    }
    while( scanf("%d",&input)!=EOF){
    printf("%d\n",a[input]);
    }
    return0;
}
发表于 2015-08-12 16:40:36 回复(0)
public class Solution {
    // dp 定义: dp[i] 表示第i年有多少头牛
    // 初始化: dp[1] = dp[2] = dp[3] = dp[4] = 1;
    // 递推式: dp[i] = dp[i-1] + dp[i-3] (当前的牛数量 = 去年的牛数量 + 可以生小牛的牛数量)
    // 前三年的牛有 dp[i-3],这些牛包括了成熟的母牛(每年生一头),也包括了未成熟的小牛(它们在第四年可以生一头牛)
    // 所以把这两部分累加起来,也就是这dp[i-3]头牛可以在第i年生 dp[i-3]头
    // 可以结合这个例子理解一下: F(5) = F(4) + F(2);画个图好理解一点
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int[] dp = new int[60];
        dp[1] = dp[2] = dp[3] = dp[4] = 1;

        for (int i = 5; i < dp.length; i++) {
            dp[i] = dp[i - 1] + dp[i - 3];
        }

        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int a = in.nextInt();
            System.out.println(dp[a]);
        }
    }
}

递推式的推导,画图比较清晰(设i = 5)

发表于 2023-07-30 23:56:08 回复(0)
母牛的故事
#include <stdio.h>

int main()
{
    int a[56],b[56],ans[56];  //a表示新生的,b表示能生的
    a[1]=0;b[1]=1;ans[1]=1;
    for(int i=2;i<56;i++)
    {
        b[i]=b[i-1];
        if(i>3)
            b[i]+=a[i-3];
        a[i]=b[i];
        ans[i]=ans[i-1]+a[i];
    }
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        printf("%d\n",ans[n]);
    }
    return 0;
}

发表于 2020-04-10 16:53:36 回复(0)

解题思路:
话不多说,典型的递推规律题,我们先计算几个结果:
注:(老母牛代表n ≥ 4)

    老母牛    初生    2年    3年    总数

第1天 1 0 0 0 1
第2天 1 1 0 0 2
第3天 1 1 1 0 3
第4天 1 1 1 1 4
第5天 2 2 1 1 6
第6天 3 3 2 1 9
————————————————
版权声明:本文为CSDN博主「hestyle」的原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://hestyle.blog.csdn.net/article/details/104626984

#include <iostream>
using namespace std;

int main(int argc, const char * argv[]) {
    //建立一张表,用于f(n)各项值,需要使用long long类型,否则会产生溢出
    long long fTable[56] = {0, 1, 2, 3};
    //注意数组下标从0开始,而计算从1开始
    for (int i = 4; i < 56; ++i) {
        fTable[i] = fTable[i - 1] + fTable[i - 3];
    }
    int number = 0;
    //scanf返回值为正确输入数据的变量个数,当一个变量都没有成功获取数据时,此时返回-1
    while (scanf("%d", &number) != - 1) {
        printf("%lld\n", fTable[number]);
    }
    return 0;
}
发表于 2020-03-03 10:41:44 回复(0)
//这么多类似斐波那契数列的题?
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    //c0记录可以产子的牛,c1,c2,c3记录养了1,2天的牛
    long long int c0[55] = {1, 1, 1, 2, 3}, c1[55] = {0, 1, 1, 1, 2}, c2[55] = {0, 0, 1, 1, 1};
    long long int sum[55] = {1, 2, 3, 4, 6};
    int n;
    int start = 5;
    while(~scanf("%d", &n))
    {
        if(n > start)
        {
            for(int i = start; i < n; i++)
            {
                c0[i] = c2[i-1] + c0[i-1];
                c2[i] = c1[i-1];
                c1[i] = c0[i-1];
                sum[i] = c0[i] + c1[i] + c2[i];
            }
            start = n;
        }
        printf("%ld\n", sum[n-1]);
    }
}

编辑于 2020-03-02 18:15:20 回复(0)
#include<iostream>
(720)#include<vector>
using namespace std;
/*
题目问到n年一共有多少头牛,一般而言,要算牛总数,需要算每年生产的牛数,最后累加即可
每年生产的牛数即为当年的成牛数
dp[i]=dp[i-1]+dp[i-3];
*/
int main() {
	int n;
	vector<int> dp(3, 1); //前3年都只有一个成年母牛可以生育,每年都生一个
	for (int i = 3; i < 56; i++) {
		dp.push_back(dp[i - 1] + dp[i - 3]);
	}
	vector<int> sum;
	sum.push_back(1);    //最初的母牛
	for (int i = 1; i < 56; i++) {
		sum.push_back(sum[i - 1] + dp[i - 1]);
	}
	while (cin >> n) {
		cout << sum[n - 1] << endl;
	}

}

发表于 2020-02-25 18:49:36 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int N = 56;
        long[] f = new long[N];
        f[1] = 1;
        f[2] = 2;
        f[3] = 3;
        f[4] = 4;
        for (int i = 5; i < N; i++) {
            f[i] = f[i - 1] + f[i - 3];
        }
        while (input.hasNext()) {
            int n = input.nextInt();
            System.out.println(f[n]);

        }
    }
}

发表于 2019-09-09 19:51:33 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int[] a=new int[56];
        a[1]=1;
        a[2]=2;
        a[3]=3;
        for(int i=4;i<a.length;i++)
            a[i]=a[i-1]+a[i-3];
        while(sc.hasNext()){
            int c=sc.nextInt();
            System.out.println(a[c]);
        }
    }
}

发表于 2019-07-26 22:16:03 回复(0)
var func = function (n) {
    let res = [0, 1, 2, 3]
    if (res.indexOf(n) !== -1)
        return res[n]
    for (let i = 4; i <= n; i++) {
        res.push(res[i - 1] + res[i - 3])
    }
    return res[n]
}

var func = function (n) {
    let res = [null, 1, 2, 3, null]
    if (res.indexOf(n) !== -1)
        return res[n]
    for (let i = 4; i <= n; i++) {
        res[4] = res[1] + res[3]
        ;[res[1], res[2], res[3]] = [res[2], res[3], res[4]]
    }
    return res[4]
}
编辑于 2018-11-06 22:14:09 回复(0)
import java.util.Scanner;

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

    public static int f1(int n) {
        if (n == 0){
            return 0;
        }
        int[] a = new int[n+1];
        if (n == 1){
            return 1;
        }else if (n == 2){
            return 2;
        }else if (n == 3){
            return 3;
        }else {
            a[1] = 1;
            a[2] = 2;
            a[3] = 3;
            for (int i = 4;i <= n; i++) {
                a[i] = a[i-1] + a[i-3];
            }
            return a[n];
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int n = sc.nextInt();
            System.out.println(f1(n));
        }
        sc.close();
    }

    /**复杂度过高
    public static int f(int n) {
        if(n == 1){
            return 1;
        }else if(n == 2){
            return 2;
        }else if (n == 3){
            return 3;
        }else {
            return f(n-1) + f(n-3);
        }
    }
     **/
}
编辑于 2018-09-01 10:51:03 回复(0)
其实题目是有错误的,按照他的说法V[0] 应该是 两头?
不过递推公式的思路是没有错的。
#include <iostream>
#include <vector>
using namespace std;
/*
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
*/
int main()
{
    vector<long long> v(56);
    long long temp;
    v[0] = 1;// D
    v[1] = 2;// D A
    v[2] = 3;// D A B 
    v[3] = 4;// D A B C
    v[4] = 6;// D A B C D D A

    for (int i = 4; i < 56; i++)
    {
        v[i] = v[i - 1] + v[i - 3];
    }
    int n;
    while (cin >> n)
    {
        cout << v[n-1] << endl;
    }
}

发表于 2018-08-11 21:14:53 回复(0)
import java.util.*;
public class Main{
    static   int[] array=new int[56];
    static {
            array[1]=1;
            array[2]=2;
            array[3]=3;
            for(int i=4;i<array.length;i++){
                array[i]=array[i-1]+array[i-3];
        }
    }
    public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    while(sc.hasNext()){
    int a=sc.nextInt();
    System.out.println(array[a]);
       }
    }
}

发表于 2018-06-27 09:26:44 回复(0)
import java.util.Scanner;
public class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            intn = sc.nextInt();
            inta[] = new int[n+3];
             
            a[1] = 1;
            a[2] = 2;
            a[3] = 3;
            for(int i = 4; i <= n; i++){
                a[i] = a[i-1] + a[i-3];
            }
            System.out.println(a[n]);
        }
        sc.close();
    }
}

发表于 2017-12-22 11:35:59 回复(0)
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); int a[] = new int[100];
        a[1] = 1;
        a[2] = 2;
        a[3] = 3;
        a[4] = 4; if (n 4) {
            System.out.println(n);
        } else { for (int i = 5; i <= n; i++) {
                a[i] = a[i - 1] + a[i - 3];
            }
            System.out.println(a[n]);
        }
    }
}
发表于 2017-11-03 18:25:47 回复(0)