兔子问题

2017-08-09  本文已影响7人  EJ17zj

做笔试题,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
上一篇 下一篇

猜你喜欢

热点阅读