美文网首页
兔子问题

兔子问题

作者: EJ17zj | 来源:发表于2017-08-09 12:09 被阅读7次

做笔试题,40分钟写出来了但没时间调试正确,还是需要加强练习啊。

忘了把问题记录下来了,大概说明下题目意思:

开始时有一对小兔子,两年后这对兔子可以生一对小兔,兔子寿命是x(>=3),兔子在生命的最后一年不能生小兔子,当活着的兔子超过10对时取走年龄最大的2对兔子。问y(>=3)年后存活的兔子的总岁数。

这题好多地方的意思容易有歧义,当时时间紧,在线未进行测试调试,也不知道有一些地方我理解的对不对。下面是我按我自己的理解写的代码,在本地测试通过。

算法思路:
用vector记录每年新出生的兔子对数,这样当年出生的对数可以用若干年前的对数来计算,需要取走时也直接对这个vector进行操作。最后再用这个vector计算总岁数。

#include <iostream>
#include <vector>

using namespace std;

class Solution {
private:
    int x;//寿命
    int y;//年
    int num_pair_live = 1;//活着的对数
    int max_pair_live = 10;//猎人开始取兔子的阈值
    int num_take = 2;//猎人每次取走的对数
    int year_generate = 2;//2年后开始生娃
    vector<int> year_numPair;//对应年生娃对数
public:
    int run() {
        init();
        return calculate_age();
    }
private:
    void init() {
        cin >> x >> y;
        year_numPair.resize(y + 1);
        year_numPair[0] = 1;
        year_numPair[1] = 0;
    }
    int calculate_age() {
        for (int year = 2; year <= y; year++) {
            year_numPair[year] = calculate_generate_numPair(year);
            hunter_round(year);
        }
        return get_ages();
    }
    int calculate_generate_numPair(int year) {
        int year_begin = year - x + 1;
        if (year_begin < 0)
            year_begin = 0;
        int year_end = year - year_generate;
        int sum = 0;
        for (int i = year_begin; i <= year_end; i++)
            sum += year_numPair[i];
        return sum;
    }
    void hunter_round(int year) {
        num_pair_live += year_numPair[year];
        int year_begin = year - x;
        if (year_begin >= 0)
            num_pair_live -= year_numPair[year_begin];

        if (num_pair_live > max_pair_live) {
            if (year_begin < 0)
                year_begin = 0;
            year_numPair[year_begin] -= 2;
            while (year_numPair[year_begin] < 0) {
                int num = year_numPair[year_begin];
                year_numPair[year_begin] = 0;
                year_begin++;
                year_numPair[year_begin] += num;
            }
        }
    }
    int get_ages() {
        int sum = 0;
        int year_begin = y - x;
        if (year_begin < 0)
            year_begin = 0;
        for (int i = 0; y - i >= year_begin; i++)
            sum += year_numPair[y - i] * i;
        return sum;
    }
};


int main() {
    Solution s;
    cout << s.run();

    return 0;
}

附若干算例:

0 1 2 3 4 5 6 x = 10
当年出生对数 1 0 1 1 2 3 5
取走对数 -1 -1
0 1 2 3 4 5 6 7 8 9 10 x = 5
当年出生对数 1 0 1 1 2 2 4 5 8 11 17
取走对数 -1 -1 -2 -2

相关文章

  • 兔子生兔子问题

    有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月...

  • 兔子问题

    做笔试题,40分钟写出来了但没时间调试正确,还是需要加强练习啊。 忘了把问题记录下来了,大概说明下题目意思: 开始...

  • 兔子繁殖问题

    一对兔子每3个月繁殖一对兔子,(第三月,检测前繁殖,T2升为T3时要产一对T0,故 T3的数量应等于T0) 每月兔...

  • Java常见算法整理

    兔子问题(斐波那契数列规律) 台阶问题 (兔子问题变种,递归规律) 素数问题(判断素数、质数方式) 水仙花数问题(...

  • Java基础程序

    生兔子问题: 统计字符个数:

  • Rabbits in Forest

    Rabbits in Forest 问题 森林中每个兔子都有自己的颜色,如果某些兔子说出与自己有相同颜色的兔子数量...

  • java生兔子问题

    古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死...

  • 【题目01】兔子问题

    【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子...

  • 兔子和萝卜问题

    题目: 有100个萝卜,一只兔子边背边吃,走一米吃一个,走到家剩下多少萝卜,(到家一共50米,兔子每次只能背50个...

  • 兔子生崽问题

    假设一对小兔的成熟期是一个月,即一个月可长成成兔,那么如果每对成兔每个月都可以生一对小兔,一对新生的小兔从第二个月...

网友评论

      本文标题:兔子问题

      本文链接:https://www.haomeiwen.com/subject/vsbfrxtx.html