兔子问题
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 |