今天做了阿里编程测验,有一道兔子繁衍问题。
题目要求:
1. 猎人把一对兔子婴儿(一公一母称为一对)放到一个荒岛上,两年之后,它们生下一对小兔,之后开始每年都会生下一对小兔。生下的小兔又会以同样的方式继续繁殖。
2. 兔子的寿命都是x(x>=3)年,并且生命的最后一年不繁殖。
3. 如果岛上的兔子多于10对,那么猎人会每年在兔子们完成繁殖或者仙逝之后,从岛上带走两对最老的兔子。
请问y年(y>=3)后荒岛上所有的兔子加起来多少岁?(注意, 在条件3执行完之后)
输入: 从命令行输入两行整数,第一行是x,第二行是y
输出: y年后荒岛上所有的兔子岁数的总和
分析:
建一个兔子类,兔子有两个属性,年龄和最大年龄。然后可以定义三个函数,获取兔子实际年龄的函数,兔子死亡函数,兔子出生函数。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//兔子类
class Rabbit
{
public:
int age;
int maxAge;
};
//获取兔子实际年龄
void getage(vector<Rabbit> &rab)
{
for(vector<Rabbit>::iterator it = rab.begin(); it!=rab.end();it++)
{
it->age++;
}
}
//兔子死亡函数
void death(vector<Rabbit> &rab)
{
for(vector<Rabbit>::iterator it = rab.begin(); it!=rab.end();)
{
//当兔子实际年龄超过最大年龄时,兔子死亡
if(it->age>=it->maxAge)
{
it = rab.erase(it);
}
else
{
it++;
}
}
}
//兔子出生函数
void increase(vector<Rabbit> &rab,int life)
{
vector<Rabbit> Temp;
for(vector<Rabbit>::iterator it = rab.begin(); it!=rab.end();it++)
{
//当兔子达到2岁时,可以繁衍
if(it->age>=2&&it->age<it->maxAge)
{
Rabbit temp = {0,life};
Temp.push_back(temp);
}
}
for(auto life:Temp)
{
rab.push_back(life);
}
}
int main()
{
int x,y;
cin>>x>>y;
Rabbit rabbit1 = {0,x};
Rabbit rabbit2 = {0,x};
vector<Rabbit> rab;
rab.push_back(rabbit1);
rab.push_back(rabbit2);
for(int i=1;i<=y;i++)
{
getage(rab);
death(rab);
increase(rab,x);
//当兔子超过神10对,带走最老的1对
if(rab.size()>20)
{
rab.erase(rab.begin());
rab.erase(rab.begin());
}
}
int num=0;
for(auto x : rab)
{
num += x.age;
}
cout << num<<endl;
return 0;
}