首页 > 试题广场 >

某星球上出现了一种怪物, 这种怪物是单亲繁殖,从出生起第3个

[问答题]
某星球上出现了一种怪物, 这种怪物是单亲繁殖,从出生起第3个月起每个月就能繁衍一批后代共m个,但是这种怪物很短命,生存第5个月后就会毙命。目前该星球有一个这样的怪物,请编写程序计算n个月后怪物的总数。(这里我们假定第5个月怪物繁衍后再毙命)
推荐
#include <iostream>
using namespace std;
int sum(int n,int m)
{
    int res=1;
    int A[100];
    A[0]=1;
    A[1]=0;
    A[2]=0;
    if(n<3)
        return res;
    for(int i=3;i<=n;i++)
    {    
        A[i]=(res-A[i-1]-A[i-2])*m;
        res+=A[i];
        if(i>=5)
            res-=A[i-5];
    }
    return res;
}
int main()
{
    int n,m;
    cin>>n>>m;
    cout<<sum(n,m)<<endl;
    return 0;
}
编辑于 2015-01-29 10:26:28 回复(2)
令f(n)作为第n个月怪物总数,令b(n)作为第n个月新增的怪物数。
则显然有b(n)=m*f(n-5)  (n>=5),当n<5的时候,b(n)=0;
并且,f(n) = b(n) + f(n-1) - b(n-5)
即,n-5个月的怪物都已经毙命,因此应该减去b(n-5)。
所以,可以用递推来解答,代码如下:

public class MonstersNum {
    int[][] matrix;

    public int calculate(int m, int n) {
        matrix = new int[n + 1][2];
        matrix[0][0] = 0;
        matrix[0][1] = 0;
        matrix[1][0] = 1;
        matrix[1][1] = 1;

        for (int i = 2; i <= n; i++) {
            matrix[i][1] = m * matrix[i - 2][0];
            if (i < 5) {
                matrix[i][0] = m * matrix[i - 2][0] + matrix[i - 1][0];
            } else {
                matrix[i][0] = m * matrix[i - 2][0] + matrix[i - 1][0] - matrix[i-5][1];
            }
        }

        return matrix[n][0];
    }

    public static void main(String[] args){
        MonstersNum monstersNum = new MonstersNum();
        for(int i=1;i<=10;i++)
            System.out.println(monstersNum.calculate(1,i));
    }
}

发表于 2015-01-27 20:45:54 回复(3)
public class Test {
    public static void main(String[] args) {
        /*
        * 某星球上出现了一种怪物, 这种怪物是单亲繁殖,从出生起第3个月起每个月就能繁衍一批后代共m个,但是这种怪物很短命,生存第5个月后就会毙命。
        * 目前该星球有一个这样的怪物,请编写程序计算n个月后怪物的总数。(这里我们假定第5个月怪物繁衍后再毙命)
        * */
        Scanner scanner = new Scanner(System.in);
        int month = scanner.nextInt();//月数
        int m = scanner.nextInt();//每次繁衍的个数
        int[] arr = new int[6];
        arr[1] = 1;
        for(int i = 4;i <= month;i++){
            arr[5] = arr[4];
            arr[4] = arr[3];
            arr[3] = arr[2];
            arr[2] = arr[1];
            arr[1] = arr[3] + arr[4] + arr[5];
        }
        int sum = 0;
        for(int i = 1;i < arr.length;i++){
            sum += arr[i];
        }
        System.out.println(sum);
    }
}

发表于 2021-08-25 00:16:08 回复(0)


发表于 2017-03-19 14:28:33 回复(0)
可以用一个数组保存不同大小的怪物的数量,然后使用一个专门的函数进行每个月的繁衍。 void coutNumInMonth(int m, vector& mst) { if ( mst.size() != 5 ) return; size_t oldZero = mst.at(0); mst[0] = (mst.at(2)+mst.at(3)+mst.at(4)) * m; mst[4] = mst[3]; mst[3] = mst[2]; mst[2] = mst[1]; mst[1] = oldZero; } size_t getNum(int n, int m) { vectormst; mst.push_back(1); mst.push_back(0); mst.push_back(0); mst.push_back(0); mst.push_back(0); while ( n-- ) { coutNumInMonth(m, mst); } return mst.at(0)+mst.at(1)+mst.at(2)+mst.at(3)+mst.at(4); }
发表于 2015-08-03 10:00:07 回复(0)
int SumOFMonster(int n,int m)
{
    vector<int> T={1,0,0,0};
    vector<int> Temp;
    int S=0;
    for(int i=0;i<n;++i)
    {
        Temp=T;
        T[0]=m*(Temp[2]+Temp[3]);
        T[1]=Temp[0];
        T[2]=Temp[1];
        T[3]=Temp[2];
        S=T[0]+T[1]+T[2]+T[3];
    }
    return S;
}

发表于 2015-04-01 18:48:17 回复(0)
public class MonstorTest {
 /**
 * 计算怪兽在month月之后的数量
 * 
 * @param month
 *            月数
 * @param per
 *            每只怪兽一次产出数
 * @return
 */
 public int monstor(int month, int per) {
     int amount = 0;
     int[] data = new int[month];
     data[0] = 1;
     for (int i = 2; i < month; i++) {
         int j = i;
         while (j >= 0) {
             if (j >= i - 4 && j <= i - 2) {
                 data[i] += data[j] * per;
             } 
             if (j <= i - 4) {
                 data[j] = 0;
             }
             j--;
         }
     }
     for (int in : data) {
         amount += in;
         System.out.print(in + "\t");
     }
     return amount;
 }

 public static void main(String[] args) {
     System.out.println(new MonstorTest().monstor(7, 10));
 }
}

发表于 2015-03-03 00:24:33 回复(0)
#include<iostream>
using namespace std;
#define m 10
int cal(int n){
int s=1;
int a[5]={0};
int b[5]={0};
if(n<3){
return s;
}
else{
n-=2;
b[2]=1;
while(n){
a[0]=(b[2]+b[3])*m;
a[1]=b[0];a[2]=b[1];a[3]=b[2];a[4]=b[3];
s=s+a[0]-b[4];
b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];
n--;
}
}
return s;
}
int main()
{
   int n;
   cin>>n;
   int s=cal(n);
   cout<<s<<endl;
}
发表于 2014-11-27 10:25:24 回复(0)