阿里测试题——荒岛小兔子

阿里测试-荒岛兔子
1. 猎人把一对兔子婴儿(一公一母称为一对)放到一个荒岛上,两年之后,它们生下一对小兔,
   之后开始每年都会生下一对小兔。生下的小兔又会以同样的方式继续繁殖。
2. 兔子的寿命都是x(x>=3)年,并且生命的最后一年不繁殖。
3. 如果岛上的兔子多于10对,那么猎人会每年在兔子们完成繁殖或者仙逝之后,从岛上带走两对最老的兔子。
请问y年(y>=3)后荒岛上所有的兔子加起来多少岁?(注意, 在条件3执行完之后)
 
输入: 从命令行输入两行整数,第一行是x,第二行是y
输出: y年后荒岛上所有的兔子岁数的总和

这个有100%的吗?能给一下思路不?
#阿里巴巴#
全部评论
#include <iostream> #include <vector> using namespace std; int main() { int x, y; while(cin >> x >> y) { vector<int> old; //存储每对的年龄 int pairs = 0; int result = 0; for(int i = 1; i <= y; i++) { if(pairs == 0) //第一年就一对,到年末一岁 { pairs++; old.push_back(1); } else { for(int j = 0; j < pairs; j++) { old[j]++; if(old[j] >= 2 && old[j] < x) //从2岁之后就生兔子了(但是最后一年不生),所以压入0 old.push_back(0); } while(!old.empty() && old[0] >= x) //看看前面的死没死,死了就去掉 old.erase(old.begin()); if(old.size() > 10) { //大于10就让猎人带走两对 old.erase(old.begin()); old.erase(old.begin()); } pairs = old.size(); } } for(int i = 0; i < pairs; i++) result += 2 * old[i]; cout <<result <<endl; } return 0; } 这是我做的,能过100%
点赞 回复
分享
发布于 2017-08-21 20:56
我想到的是维护一个10大小的数组,每个值记录对应的年数,每个值不能超过x,并且当值大于等于2时,每过一年数组个数加1,超过数组个数10的话就减去两个值最大的。依次循环y年,最后输出数组和的2倍。 还有,return 2;直接通过10%。。。。。。狗血
点赞 回复
分享
发布于 2017-08-21 20:01
滴滴
校招火热招聘中
官网直投
怕是要用优先队列
点赞 回复
分享
发布于 2017-08-21 20:07
我是list做得,维护一个长度为x的队列用来表示年龄分别为0~x-1的兔子对数,然后每一年计算新生的兔子对数插入list的头部,然后删除链表的尾部,在判断猎人抓兔子。最后y年过去,计算年龄总数。 我记得这道题之前有人发过帖子,我看过那篇帖子......他就是用list做的......
点赞 回复
分享
发布于 2017-08-21 20:11
这玩意好像斐切那波
点赞 回复
分享
发布于 2022-04-29 13:05

相关推荐

点赞 9 评论
分享
牛客网
牛客企业服务